使用toFixed:
时遇到舍入错误我在数值计算中使用了toFixed(2)
,但在少数情况下,舍入结果并不像预期的那样。
假设toFixed(2)
已应用于值17.525
,则它会提供结果17.52
,如果将其应用于5.525
,则会提供结果5.53
}。
在后一种情况下,舍入结果是准确的,因此您可以建议需要做什么来获得准确的舍入结果,如后面的情况。或者你可以建议一个替代这个toFixed函数来获得正确的舍入结果吗?
答案 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,并在选项中将minimumFractionDigits
和maximumFractionDigits
设置为相同的数字(要显示的位数)。
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