返回课程

为什么 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的幂的 fractions 在二进制系统中可以精确表示,现在我们可以对其进行四舍五入。

alert( Math.round(6.35 * 10) / 10 ); // 6.35 -> 63.5 -> 64(rounded) -> 6.4