ruby printf-format-specifierを使用した奇数丸め問題
-
10-07-2019 - |
質問
これに関するアイデアはありますか?
実行時:
printf("%。0f&quot ;, 40.5)
Windowsボックスでは、リターンは「41」です。しかし、本番用のubuntuサーバーでは、" 40"
を取得しています解決
バイナリ浮動小数点の不正確さの単純な例のように見えます。 1台のマシンでは、40に丸められる40.499999999を取得します。他のマシンでは40.500000000001になり、41に丸められます。
正確な数値が必要な場合は、バイナリ浮動小数点を使用しないでください。固定小数点、または10進浮動小数点を使用できます。
編集:BigDecimalを使用していると言います。 #round
を使用してから #to_i
を使用して、フロートへの変換を回避しないのはなぜですか? (または、 #round
の代わりに #floor
または #ceil
...目標が明確ではありません。)
b = BigDecimal.new("40.5")
print b.round.to_i # => 41
他のヒント
代わりに .round
を使用してはどうですか? Railsはそれをさらに強化し、精度を指定できるようにします( APIを参照doc )。
代わりに%.0gを使用します
ScottJの答えはあなたの問題を説明しません-40.5は正確にバイナリで表現できます。おそらく何が起こっているのでしょうか:Windowsのprintf" rounds half up、quot; Ubuntuのprintf" round half half。"
所属していません StackOverflow