为什么 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
的幂的 fractions 在二进制系统中可以精确表示,现在我们可以对其进行四舍五入。
alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(rounded) -> 6.4