JavaScript 小数点计算时失精问题
【摘要】 在页面开发中,不知道各位有没有遇到过 JavaScript 小数点计算失精问题。这里主要记录一下扩大倍数的解决方法
序
在页面开发中,不知道各位有没有遇到过JavaScript小数点计算失精问题。
我曾经就遇到过0.018 * 100 != 1.8
的情况
当时使用的是Vue
,界面上要显示百分比,然后使用{{ number * 100 }}
。当时就出了小数点精度问题,一连串小数显示在了上面。
查看了一下,number
数值是正确的,不是后台接口整活,那么就只有JavaScript的小数点精度计算问题了。
解决方法
先来说说解决方法: Math.round((i * 100) * 1000)/1000
这种方式通过将需要运算的小数扩大10倍100倍,将小数扩大到整数后,再进行运算,最后再通过除法缩小到当前倍数
原因
产生小数值精度问题的原因是在计算机内部存储数值时,会通过二进制的方式存储,那么当两个数值相加或相乘时,也是通过二级制数字进行计算,然后再将这个二进制结果转换成十进制输出给我们。
同理,小数在计算时也是一样,但是小数转换成二进制会出现问题,像0.5这类可以很轻松的转换成二进制,但是其他的数值就非常困难了
例子:在下方例子中,使用toString(2)
可以将十进制数值转换成二进制,但是像0.1,0.2,0.4这类数值二进制后都是小数点后一系列数字,在0.1 + 0.2
时,因为无限循环的数据不可能在计算机内部存在,所以必须要有一个限制,这里对应的0.1和0.2二进制就不精准了,这样一来,两者相加出来的结果就不可能等于0.3了
let n1 = 0.1, n2 = 0.2, n3 = 0.4, n4 = 0.5
console.log(n1.toString(2)) // 0.0001100110011001100110011001100110011001100110011001101
console.log(n2.toString(2)) // 0.001100110011001100110011001100110011001100110011001101
console.log(n3.toString(2)) // 0.01100110011001100110011001100110011001100110011001101
console.log(n4.toString(2)) // 0.1
console.log(n1 + n2); // 0.30000000000000004
所以可以将0.1 和 0.2 乘10之后相加,除以10,得到最后的0.3
console.log((n1 * 10 + n2 * 10) / 10); // 0.3
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)