「前端每日一问(9)」0.1 + 0.2 为什么不等于 0.3?如何解决?
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
本题难度:⭐ ⭐
难度评级最高五星,最低一星。
答:
简单用文字描述一下就是,
计算机是用二进制进行计算的,小数在十进制转二进制的过程中可能会无限循环。
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 和 === 有什么区别?
下一篇:
转载自:https://juejin.cn/post/7071066911819169800