為什麼 6.35.toFixed(1) == 6.3?
重要性:4
根據文件,Math.round
和 toFixed
都會四捨五入到最接近的數字: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