JavaScript 小数点计算时失精问题

举报
空城机 发表于 2022/07/21 08:50:05 2022/07/21
【摘要】 在页面开发中,不知道各位有没有遇到过 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。