レッスンに戻る

なぜ 6.35.toFixed(1) == 6.3?

重要性: 4

ドキュメントによると、Math.roundtoFixed は両方とも最も近い数値に丸めます: 0..4 は下がり、5..9 は上がります。

例えば:

alert( 1.35.toFixed(1) ); // 1.4

下の似た例では、なぜ 6.356.4 ではなく 6.3 に丸められるのでしょうか?

alert( 6.35.toFixed(1) ); // 6.3

正しい方法で 6.35 を丸める方法はどうなるでしょう?

内部的には、小数部分 6.35 は無限のバイナリです。このような場合はいつものように、精度が低下されたものが保存されています。

見てみましょう:

alert( 6.35.toFixed(20) ); // 6.34999999999999964473

精度の低下は数値のインクリメント/デクリメント両方を引き起こす可能性があります。この特定のケースで、数値は少し小さくなり、そういう訳で丸め下げされます。

また、1.35 は何でしょう?

alert( 1.35.toFixed(20) ); // 1.35000000000000008882

ここでは、精度の低下は数値を少し大きくしました。なので丸め上げられます。

正しい方法で丸めたい場合、6.35 で問題を解決するにはどうすればいいですか?

そのためには、丸める前に整数に近づける必要があります:

alert( (6.35 * 10).toFixed(20) ); // 63.50000000000000000000

63.5 はまったく精度の低下がないことに注意してください。それは、小数部分 0.5 は実際には 1/2 だからです。2のべき乗で除算された分数は、バイナリシステムで正確に表現されます。今度はそれを丸めることができます:

alert( Math.round(6.35 * 10) / 10); // 6.35 -> 63.5 -> 64(丸められた) -> 6.4