JavaScript数字格式不正确

问题描述 投票:0回答:2

我在用JavaScript格式化数字时遇到了一个古怪的问题。我从网络上的各种来源借来了几个功能。除一种情况外,每种方法均运作良好。这是发生错误时的执行代码:

lth=appl.length+3;
var table = $("#unitsCompleted")[0];
var sum=0;
for(i=0; i<temp.length; i++){
    sum += Number(table.rows[lth].cells[i+1].innerHTML);
}
var t=formatNumber(sum);            
$("#mtf_retail").html("$ "+t);

相同的代码在其他两个地方使用。实际上只是被复制。以下是格式化功能:

function formatNumber(num) {
    return num.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}

除了总的是1787.78之外,它还不错。在图像中,您可以看到它完美地格式化了1,249.69 enter image description here

javascript html dom
2个回答
1
投票

regexp上的[g]标志告诉regexp引擎多次匹配模式并替换每个实例。由于您的电话号码不是1787.78,而是1787.7800000000002,因此模式将在连续3个数字前的每个数字之后匹配,并在其后放置一个逗号。

为避免这种情况,但仍使正则表达式在长整数上多次匹配,有两种方法:

  • 调整正则表达式,使其与之前的句点不匹配(但是由于需要回溯,所以它相当昂贵和丑陋,我不推荐使用)

  • 将数字四舍五入到小数点后两位

这应该起作用:

function formatNumber(num) {
    return num.toFixed(2).toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,')
}

0
投票

这是已知问题,由于浮点数的内部表示而存在。您可以在控制台中尝试

console.log(0.1 + 0.2)

并检查这不是0.3,而是0.30000000000000004。您可以尝试按Lennholm的方法将num.toString()更改为num.toFixed(2)。但这可能隐藏更大的问题。想象一下,您有一个用户拥有0.3美元,而他想以10美分的价格购买三件商品。您的代码检查将返回给用户0.1 * 3 = 0.30000000000000004。然后他会看到消息,因为钱不够,他无法购买物品。更好的解决方案是将钱存储在整数-美分中。

© www.soinside.com 2019 - 2024. All rights reserved.