浮点数!乘100、10后精度变化!

 

先贴一个网址,感觉写的很详细,似乎原理都分析了,但没怎么看,好像没说怎么解决...

http://justjavac.iteye.com/blog/1864938

 

现象:

0.56*100 // 56.00000000000001
0.56*10 // 5.6000000000000005
0.57*10 // 5.699999999999999
5.6/10 // 0.5599999999999999

 

包括ie6的所有浏览器都是如此

 

出现场景

需要把0.56 显示为 56% ,然后居然是56.00000000000001% ,无语了

 

解决:

 

似乎正常了:

0.57*1000/10

 

但这种情况问题依旧:

0.5757*1000/10 // 57.57000000000001

原因是:

575.7/10 // 原因是5.7除了10

 

发现规律:避免0.56、5.6附近的一位或两位小数对 100或者10进行 乘除

 

 

所以:

方案1:先乘比小数多一位的倍数,再除去多余倍数

0.5757*100000/1000 //正常

但这种方案,没有依靠原理,凭了大部分直觉,所以,上硬招:

方案2:先转字符串,再移动小数点

function toPercent(num) {
    var arr = (num + '').split('.'),
        otherHalf = (arr[1] ? arr[1] : '') + '000';
        otherHalf = otherHalf.substr(0, 2) + '.' + otherHalf.substr(2);

    return (arr[0] + otherHalf) * 1;
}
toPercent(.57) // 57
toPercent(5.7) // 570
toPercent(57) // 5700 

总觉得上面的方案2不够好,效率不高,思考一番后,上优化方案,见下

方案3:使用正则

function toPercent(num) {
    return (num + '00').replace(/\.([\d]{2})/,'$1.') * 1;
}

 

 

 

转载于:https://www.cnblogs.com/cqlql/p/5677557.html

你可能感兴趣的:(浮点数!乘100、10后精度变化!)