レッスンに戻る

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を正しく丸めるにはどうすればよいでしょうか?

内部的には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