2017-09-25 15 views
0

浮動小数点数を指数表記なしの文字列、つまり"e-10"などで終わる数値にするにはどうすればよいですか?私はto_sが指数表記で数値を返すことを発見しました。浮動小数点数を指数表記なしの文字列として取得するにはどうすればよいですか?

ms = 1457000.0000000002 % 1000 # => 2.3283064365386963e-10 
ms.to_s      # => "2.3283064365386963e-10" 

私は"0.0000000002"を取得したいと思いますが、正しくはありません。

上記の例を使用して"%f" % msを評価すると、"0.0000000002"とはかなり異なる"0.000000"が得られます。

+0

可能な重複(https://stackoverflow.com/questions/1189618/ruby-controlling-printing-in -scientific-notation) – moveson

+0

その解決策は私のために駄目ではありません、そうです。上記の例を使用して "%f"%msを実行すると、 "0.000000"となり、 "0.0000000002"とは大きく異なります。 –

+0

さて、技術的には、それほど違いはありませんが、あなたが望む正確さを反映していないかもしれません。 –

答えて

1

小数点以下の桁数(DP)%fを指定すると、それでも機能すると思います。ここでは、特定のだあなたは10にDPを指定した場合ので、正確になり、出力がe-10の指数である、例えば、あなたの例を見てみましょう:

ms = 1457000.0000000002 
secs, ms = ms.divmod(1000) 
my_answer = '%.10f' % ms 

あなたの出力はこれがあるように思われる=> "0.0000000002"

+1

ありがとうございます。あらかじめ小数点以下の桁数を知らないとどうなりますか? –

0

になりますこの問題の複製:

Force Ruby to not output a float in standard form/scientific notation/exponential notation

あなたはフォーマットされた番号を印刷するのにはsprintfを使用することができます

ms = 1457000.0000000002 
sprintf("%.10f", ms) 
=> "1457000.0000000002" 

これは、浮動小数点数は、完全に正確ではないことに注意することが重要です - あなたは16を言って、より多くの桁数を表示するためにはsprintfを言うならば、あなたはこの不正確さが表示されます。

sprintf("%.16f", ms) 
=> "1457000.0000000002328306" 

トリックの精度を強制するために合理的に値を変換するto_rを使用することである:[ルビー:科学的表記法で印刷制御]の

ms = '1457000.0000000002'.to_r 
=> (7285000000000001/5000000000) 
sprintf("%.16f", ms) 
=> "1457000.0000000002000000" 
関連する問題