6.35.toFixed(1) が 6.3 になるのはなぜですか?
重要性: 4
ドキュメントによると、Math.round
とtoFixed
の両方は最も近い数値に丸めます。0…4
は下に切り捨て、5…9
は上に丸めます。
たとえば
alert( 1.35.toFixed(1) ); // 1.4
以下の同様の例では、なぜ6.35
は6.4
ではなく6.3
に丸められるのでしょうか?
alert( 6.35.toFixed(1) ); // 6.3
6.35
を正しく丸めるにはどうすればよいでしょうか?
内部的には10進数小数点6.35
は終わりのない2進数になります。そのような場合は常に精度が失われて保存されます。
見てみましょう
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
には精度の低下がまったくないことに注意してください。それは10進数の部分0.5
が実際には1/2
だからです。2
の累乗で割った分数と2進数表記では正確に表されるため、丸めることができます。
alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(rounded) -> 6.4