javascript添加十进制数问题

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?


使用toFixed将其转换为字符串,去掉一些小数位,然后将其转换回数字。

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 ) );

结论

不要使用Math.round( (## + ## + ... + ##) * 1e12) / 1e12

相反,使用( ## + ## + ... + ##).toFixed(5) )

在IE 9中,toFixed工作得很好。


1
2
3
4
5
function add(){
    var first=parseFloat($("#first").val());
    var second=parseFloat($("#second").val());
    $("#result").val(+(first+second).toFixed(2));
}

演示。


这是浮点的常见问题。

parseFloat结合使用toFixed

以下是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