JavaScript 中的舍入问题
Rounding problems in JavaScript
我在 JavaScript 中遇到了舍入问题。我正在使用舍入函数:
function roundup(rnum, rlength){
var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
return newnumber;
}
var amount = roundup(2253.825, 3);
奇怪的是,当我对数字 2253.825
进行四舍五入时,结果是 2253.82
而必须是 2253.83
。当我对数字 5592.825
进行四舍五入时,结果是 5592.83
,这是正确的。
知道如何解决这个问题吗?
由于 IEEE 754 双打的工作方式,问题自然而然地出现了。如果您真的想始终获得数学上正确的结果,则需要使用自定义数据类型,例如像 this one.
这样的 BigDecimal 实现
也请看看这个answer,因为它可能会有用。
此处出现浮点舍入错误。 2620.825 * 100
是 262082.49999999997
,所以当你四舍五入时,结果是 262082
。
这里有一个更强大的方法来纠正这个问题:
function roundup(rnum, rlength) {
var shifted = rnum * Math.pow(10, rlength),
rounded = Math.round(shifted),
delta = Math.abs(shifted - rounded);
if (delta > 0.4999999 && delta < 0.5) {
rounded += (rounded < 0 ? -1 : 1);
}
return rounded / Math.pow(10, rlength);
}
console.log("2620.825 :=> " + roundup(2620.825, 2));
console.log("2621.825 :=> " + roundup(2621.825, 2));
console.log("2620.8255 :=> " + roundup(2620.8255, 2));
我在 JavaScript 中遇到了舍入问题。我正在使用舍入函数:
function roundup(rnum, rlength){
var newnumber = Math.round(rnum * Math.pow(10, rlength)) / Math.pow(10, rlength);
return newnumber;
}
var amount = roundup(2253.825, 3);
奇怪的是,当我对数字 2253.825
进行四舍五入时,结果是 2253.82
而必须是 2253.83
。当我对数字 5592.825
进行四舍五入时,结果是 5592.83
,这是正确的。
知道如何解决这个问题吗?
由于 IEEE 754 双打的工作方式,问题自然而然地出现了。如果您真的想始终获得数学上正确的结果,则需要使用自定义数据类型,例如像 this one.
这样的 BigDecimal 实现也请看看这个answer,因为它可能会有用。
此处出现浮点舍入错误。 2620.825 * 100
是 262082.49999999997
,所以当你四舍五入时,结果是 262082
。
这里有一个更强大的方法来纠正这个问题:
function roundup(rnum, rlength) {
var shifted = rnum * Math.pow(10, rlength),
rounded = Math.round(shifted),
delta = Math.abs(shifted - rounded);
if (delta > 0.4999999 && delta < 0.5) {
rounded += (rounded < 0 ? -1 : 1);
}
return rounded / Math.pow(10, rlength);
}
console.log("2620.825 :=> " + roundup(2620.825, 2));
console.log("2621.825 :=> " + roundup(2621.825, 2));
console.log("2620.8255 :=> " + roundup(2620.8255, 2));