回到课程

为什么 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