返回課程

為什麼 6.35.toFixed(1) == 6.3?

重要性:4

根據文件,Math.roundtoFixed 都會四捨五入到最接近的數字:0..4 捨去,而 5..9 進位。

例如

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

在以下類似的範例中,為什麼 6.35 會捨入到 6.3,而不是 6.4

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(rounded) -> 6.4