为什么 0.1 + 0.2 不等于0.3(小数精度问题)

1/6/2022 JavaScript

参考资料:

  1. 在js中为什么0.1+0.2不等于0.3 (opens new window) 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
  2. js变量的数据 (opens new window) 时间:05:13
  • 在JS中为什么0.2+0.1>0.3?⭐⭐⭐⭐

  • 答:

    • 精简回答:根本原因是小数转换成2进制数据存储到计算机里面的时候会产生循环问题。截取之后的二进制数据进行相加之后,再转换成十进制,就变成了0.30000004

    • 详细解释:在js中,浮点数是使用64位固定长度来表示的,最高位为符号位,11位用来表示指数位,剩下的52位表示尾数位。由于只有52位表示尾数位,而0.1转为二进制是一个无限循环数,所以会出现精度缺失。把0.1存到内存中再取出来转换成十进制就不是原来的0.1了,会变成0.100000000000000005551115123126。因而0.1+0.2先转换成二进制计算,计算结果取前52位,转换成十进制后就是结果大于0.3

      参考:浮点数的小数位按照“乘2取整,顺序排列”的方法转换成二进制表示

  • 那为什么0.2+0.3=0.5呢?

  • 答:

    • 因为0.2和0.3转换成二进制后尾位数都等于52位,相加又恰巧前52位尾数都是0,所以结果为0.1,等于十进制的0.5
  • 面试官:那既然0.1不是0.1了,为什么在console.log(0.1)的时候还是0.1呢?⭐⭐⭐

  • 答:在console.log的时候会二进制转换为十进制,十进制再会转为字符串的形式,在转换的过程中发生了取近似值,所以打印出来的是一个近似值的字符串

# 解决方法

# 方法一:通过程序自动判断有多少小数,扩大相应的倍数转换成整数,在完成整数运算后再除以扩大的数值,最后得到浮点数并返回

# 方法二:通过引入库进行解决

bignumber.js,decimal.js,以及big.js https://www.cnblogs.com/aurora-ql/p/14076481.html https://www.runoob.com/w3cnote/js-precision-problem-and-solution.html

Last Updated: 3/6/2022, 10:19:54 AM