JavaScript 添加小数问题

因此,我正在编写一个脚本,将两个数字(十进制数)相加,我遇到了一个问题。

Http://jsfiddle.net/derekl/esqnc/

剧本是我写的,结果还不错:

0.1 + 0.5  //0.6
0.2 + 0.3  //0.5

但很快我就明白了:

0.1 + 0.2  //0.30000000000000004
0.01 + 0.06  //0.06999999999999999

我觉得这样不对。我知道对有限位使用浮点数是一个缺点,但是我找不到一种方法来解决这个问题。

Math.ceil   //No
Math.floor  //No
.slice      //No

更新

有没有可能先把这些数字乘以1000,然后把它们加起来再除以1000?

138531 次浏览

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

+(0.1 + 0.2).toFixed(12) // 0.3

看起来 IE 的 toFixed有一些奇怪的行为,所以如果你需要支持 IE 这样的东西可能会更好:

Math.round((0.1 + 0.2) * 1e12) / 1e12
function add(){
var first=parseFloat($("#first").val());
var second=parseFloat($("#second").val());
$("#result").val(+(first+second).toFixed(2));
}

演示。

这是浮点数的常见问题。

结合使用 toFixedparseFloat

以下是用 JavaScript 编写的 例子:

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

测试这个 Javascript:

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

在 IE9中,toFixed工作得非常好。