toFixed(2)轮“x.525”不一致?

时间:2012-05-26 16:44:07

标签: javascript rounding

使用toFixed:

时遇到舍入错误

我在数值计算中使用了toFixed(2),但在少数情况下,舍入结果并不像预期的那样。

假设toFixed(2)已应用于值17.525,则它会提供结果17.52,如果将其应用于5.525,则会提供结果5.53 }。

在后一种情况下,舍入结果是准确的,因此您可以建议需要做什么来获得准确的舍入结果,如后面的情况。或者你可以建议一个替代这个toFixed函数来获得正确的舍入结果吗?

4 个答案:

答案 0 :(得分:5)

浮点不准确意味着大多数以.525结尾的数字实际上是.52500..1,其他数字是.5249999 .....

值的舍入方式取决于IEEE-754浮点中最接近的实际表示是高于还是低于所需值。

答案 1 :(得分:3)

而不是toFixed()使用Math.ceil()Math.floor()Math.round()

一样
var rnum = 5.525,
    decimalPlaces = 2,
    factor = Math.pow(10, decimalPlaces),
    newnumber = Math.round(rnum * factor) / factor,
    mydecimalvalue = parseFloat(newnumber); 

结果为5.53

答案 2 :(得分:1)

将数字转换为字符串并使用它?

在尝试使用Math.round或使用Math.ceil模拟最近的舍入后,这是最后的手段,但失败了。当乘以100时,某些数字(例如17.525)将小于其值(1752.5)的100倍,而其他数字(例如17.545)将略高于其值(1754.5)的100倍。

答案 3 :(得分:1)

使用Intl.NumberFormat,并在选项中将minimumFractionDigitsmaximumFractionDigits设置为相同的数字(要显示的位数)。

const formatter = [0, 1, 2, 3, 4, 5].map(
    (decimals) =>
        new Intl.NumberFormat('en-US', {
            minimumFractionDigits: decimals,
            maximumFractionDigits: decimals,
        }),
);

console.log(formatter[2].format(17.525)); // 17.53
console.log(formatter[2].format(5.525)); // 5.53
console.log(formatter[2].format(1.005)); // 1.01
console.log(formatter[2].format(8.635)); // 8.64
console.log(formatter[2].format(8.575)); // 8.58
console.log(formatter[2].format(35.855)); // 35.86
console.log(formatter[2].format(859.385)); // 589.39
console.log(formatter[2].format(859.3844)); // 589.38
console.log(formatter[2].format(.004)); // 0.00
console.log(formatter[2].format(0.0000001)); // 0.00

// keep in mind that this will not be formatted as expected, as the value that
// you pass is actually 0.07499999999998863. 
console.log(formatter[2].format(239.575 - 239.5)); // 0.07
console.log(formatter[2].format(0.07499999999998863)); // 0.07