如何进行js的运算精度问题
导读:本文共4814字符,通常情况下阅读需要16分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 都知道拿js去做运算肯定会遇到计算精准的问题(或称舍入误差),但是怎么避开这些坑?精准丢失的原因计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926…,1.3333… 等。JavaScript 使用 64 位存储数字类型,因此超出的会舍去。舍去的部分就是精度丢失的部分。以下是十进制小数对应的二进制表示0.1&... ...
目录
(为您整理了一些要点),点击可以直达。都知道拿js去做运算肯定会遇到计算精准的问题(或称舍入误差),但是怎么避开这些坑?
精准丢失的原因
计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926…,1.3333… 等。JavaScript 使用 64 位存储数字类型,因此超出的会舍去。舍去的部分就是精度丢失的部分。
以下是十进制小数对应的二进制表示
解决方案
如需要更加复杂的计算类库,可以考虑 math.js等知名类库
浮点数(小数)
对于小数,前端出现问题的几率还是很多的,尤其在一些电商网站涉及到金额等数据。解决方式:把小数放到位整数(乘倍数),再缩小回原来倍数(除倍数)转换成整数后的运算结果 不能超过 Math.pow(2,53)
浮点精准运算
使用方法:
超大整数
虽然运算结果不超过Math.pow(2,53)的整数(9007199254740992)也可以使用上面的方法,但是如果就是有超过的呢,实际场景中可能会是一些批次号、号段之类的需求,这里我也找到了一个解决方案,直接上代码。
在线运算:https://www.shen.ee/math.html
使用方法:不可使用负数,参数最好使用字符串
toFixed 的修复
在Firefox / Chrome中,toFixed并不会对于最后一位是5的如愿以偿的进行四舍五入。
Firefox 和 Chrome的实现没有问题,根本原因还是计算机里浮点数精度丢失问题。
修复方式:
如何进行js的运算精度问题的详细内容,希望对您有所帮助,信息来源于网络。