likes
comments
collection
share

「前端每日一问(9)」0.1 + 0.2 为什么不等于 0.3?如何解决?

作者站长头像
站长
· 阅读数 23

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

本题难度:⭐ ⭐

难度评级最高五星,最低一星。

「前端每日一问(9)」0.1 + 0.2 为什么不等于 0.3?如何解决?

答:

简单用文字描述一下就是,

计算机是用二进制进行计算的,小数在十进制转二进制的过程中可能会无限循环。

JavaScript的Number类型为双精度IEEE 754 64位浮点类型,最多存储 64 位二进制。

0.1 和 0.2 在转换成二进制后会无限循环,超过 64 位的位数会被截掉,出现了精度的损失。

精度受损的二进制相加后再转换为十进制,就出现了十进制也不精准的问题。

至于小数在十进制转二进制的过程中为啥可能会无限循环,原理详情可看这篇文章,你知道 0.1+0.2 !==0.3是进制问题,但你讲不出个所以然,是吧?🐶

了解原理固然是好的,但不了解原理也没啥,知道有这个现象,并且在日常开发中,有数值计算需求时知道怎么去处理才是最重要的。

类似问题

  • 大整数精度问题

  • toFixed 四舍五入结果不准确

9007199254740992 + 1   // 9007199254740992
1.335.toFixed(2)       // 1.33

如何解决

如果只是大整数精度问题,可以用 BigInt

如果一步到位解决所有问题,最好的方案是直接引三方库,不要自己去折腾,自己去折腾总有可能出各种 bug 的。

下面这三个库都是比较成熟的,我们可以根据自己的需求来选择对应的工具。

他们的原理都是把浮点数转化为字符串,再模拟实际运算的过程。

与本题相关问题:

「前端每日一问(1)」BigInt 是什么? 解决了什么问题?

结尾

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(8)」Object.is 和 === 有什么区别?

下一篇:

「前端每日一问(10)」typeof 与 instanceof 有什么区别?