前端— toFixed() 的精度问题
标签:
JavaScript
之前的项目里涉及到了金额的计算,要求保留两位小数或4位小数,一直是采用原生的Number对象的原型对象上的toFixed()方法来计算的。直到有一天测试提了Bug,反复验证后发现,用 tofixed 来保留n位小数在某种情况下确实会出精度问题,真叫人头大 (ÒωÓױ)!!!
下面进行测试
let num = 1.234 num.toFixed(2) //1.23 正确 let num = 1.235 num.toFixed(2) //1.24 正确 let num = 1.236 num.toFixed(2) //1.24 正确 let num = 0.234 num.toFixed(2) //0.23 正确 let num = 0.235 num.toFixed(2) //0.23 错误 X let num = 0.236 num.toFixed(2) //0.24 正确
也就是说,当num < 0 ,且需要判断是否进位的那位是5时,这一位会错误的没有进上。这只是通过现象归纳的bug原因,归根结底还是二进制浮点数的精度不够导致的。
可以用 $toFixed(num,n) 方法来代替num.toFixed(n) :
< ps. 暂时还没发现问题,灰常滴好用 >
$tofixed (num, n) { var symbol = 1 if (num < 0) { // 符号为负 symbol = -1 num *= -1 } var num2 = (Math.round(num * Math.pow(10, n)) / Math.pow(10, n) + Math.pow(10, -(n + 1))) .toString().slice(0, -1) return parseFloat(num2 * symbol).toFixed(n) }
有什么问题,欢迎大家指出。
点击查看更多内容
3人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦