JavaScript adding decimal numbers issue
本问题已经有最佳答案,请猛点这里访问。
所以我正在编写一个脚本,将两个数字(十进制数字)相加,这是我遇到的一个问题。
http://jsfiddle.net/derekl/esqnc/
我写了剧本,结果很好:
1 2 | 0.1 + 0.5 //0.6 0.2 + 0.3 //0.5 |
但不久我就明白了:
1 2 | 0.1 + 0.2 //0.30000000000000004 0.01 + 0.06 //0.06999999999999999 |
我觉得不对劲。我知道使用有限位浮点是一个缺点,但我找不到解决这个问题的方法。
1 2 3 | Math.ceil //No Math.floor //No .slice //No |
更新
是否可以先将数字乘以1000,然后再加上,再除以1000?
使用
1 | +(0.1 + 0.2).toFixed(12) // 0.3 |
看起来IE的EDOCX1[0]有一些奇怪的行为,所以如果你需要支持IE,这样做可能更好:
1 | Math.round((0.1 + 0.2) * 1e12) / 1e12 |
测试此javascript:
1 2 3 4 5 6 7 8 9 | var arr = [1234563995.721, 12345691212.718, 1234568421.5891, 12345677093.49284]; var sum = 0; for( var i = 0; i < arr.length; i++ ) { sum += arr[i]; } alert("fMath(sum) =" + Math.round( sum * 1e12 ) / 1e12 ); alert("fFixed(sum) =" + sum.toFixed( 5 ) ); |
结论
不要使用
相反,使用
在IE 9中,
1 2 3 4 5 | function add(){ var first=parseFloat($("#first").val()); var second=parseFloat($("#second").val()); $("#result").val(+(first+second).toFixed(2)); } |
演示。
这是浮点的常见问题。
与
以下是javascript中的示例:
1 2 3 4 5 6 7 | function roundNumber(number, decimals) { var newnumber = new Number(number+'').toFixed(parseInt(decimals)); return parseFloat(newnumber); } 0.1 + 0.2; //=> 0.30000000000000004 roundNumber( 0.1 + 0.2, 12 ); //=> 0.3 |