Der*_*會功夫 51 javascript numbers
所以我正在制作一个脚本,将两个数字(十进制数字)加在一起,我遇到了一个问题.
http://jsfiddle.net/DerekL/esqnC/
我制作了剧本,结果非常好:
0.1 + 0.5 //0.6
0.2 + 0.3 //0.5
Run Code Online (Sandbox Code Playgroud)
但很快我就看到:
0.1 + 0.2 //0.30000000000000004
0.01 + 0.06 //0.06999999999999999
Run Code Online (Sandbox Code Playgroud)
它对我来说不合适.我知道使用有限位的浮点是一个缺点,但我找不到解决这个问题的方法.
Math.ceil //No
Math.floor //No
.slice //No
Run Code Online (Sandbox Code Playgroud)
UPDATE
是否可以先将数字乘以1000,然后加上它们再除以1000?
Dag*_*bit 54
使用toFixed
将其转换为与剃掉了一些小数位的字符串,然后将其转换回数字.
+(0.1 + 0.2).toFixed(12) // 0.3
Run Code Online (Sandbox Code Playgroud)
看起来IE toFixed
有一些奇怪的行为,所以如果你需要支持IE这样的东西可能会更好:
Math.round((0.1 + 0.2) * 1e12) / 1e12
Run Code Online (Sandbox Code Playgroud)
这是浮点数的常见问题。
使用toFixed
与组合parseFloat
。
这是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
Run Code Online (Sandbox Code Playgroud)
function add(){
var first=parseFloat($("#first").val());
var second=parseFloat($("#second").val());
$("#result").val(+(first+second).toFixed(2));
}
Run Code Online (Sandbox Code Playgroud)
小智 5
测试此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 ) );
Run Code Online (Sandbox Code Playgroud)
不要使用 Math.round( (## + ## + ... + ##) * 1e12) / 1e12
相反,使用 ( ## + ## + ... + ##).toFixed(5) )
在IE 9中,toFixed
效果很好。
归档时间: |
|
查看次数: |
77017 次 |
最近记录: |