浮点数!乘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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值