1

JavaScriptで数値を小数点以下2桁まで切り上げたい。SO に関する多くの投稿で、.toFixedメソッドの動作はさまざまなブラウザーでは予測できないと言っているのを見つけました。

そして、例外なく受け入れられている多くの場所でこの解決策を見つけました

Math.round(yournumber * 100 ) / 100

しかし、私は正しいが、いくつかの間違った結果もこの計算から見つけました

Math.round( 1.27532423 * 100 ) / 100  = 1.28 // this seems correct
Math.round( 1.275 * 100 ) / 100       = 1.27 // as I understand it should also 1.28
Math.round( 1.276 * 100 ) / 100       = 1.28 

何かが足りないのでしょうか、それとも私の理解が正しくありませんか?

編集

ちょうどそれを見つけた

1.275 * 100127.49999999999999返され、それが理由です。返された場合127.5、正しい結果が得られます。

しかし、なぜこれを返すのですか127.49999999999999????

4

4 に答える 4

1

@ scott.korin コメントが変更されたため

Math.round( 1.27532423 * 100 ) / 100

Math.round( 1.27532423 * 10 * 10) / 100 // changed 100 to 10*10 

そしてそれは魅力のように働きました:)

ありがとう!

于 2013-03-14T04:14:44.757 に答える
0

浮動小数点数の計算は、2 進数の52桁 (10 進数の約 16 桁)までしか正確ではありません。1.275 は 1.28 に切り上げられるはずですが、1.01000110011b == 1.274902d は 1.27 に正しく切り捨てられます。

于 2013-03-14T03:47:23.507 に答える
0

その問題の回避策は次のとおりです。

Math.round((1.275*100).toFixed(2))/100 // returns 1.28

問題の説明は、次のQ&Aにあります。

于 2013-03-14T04:20:45.967 に答える
0

この浮動小数点数の丸め誤差を回避するには、次のように最大精度 10^21 を乗算します。

Math.round(1.275*Math.pow(10,21)/Math.pow(10,19))/100 == 1.28
于 2013-03-14T04:50:46.443 に答える