用 js 计算带小数的加减法时遇到计算精度丢失,导致产生了无限小数。
这种情况常见地令人吃惊,随便用小数进行加减乘除都会出现这种问题:
对基本四则运算的理解在现代计算机面前受到了挑战。
产生浮点数计算精度不准确的原因:
- 计算机算的是二进制非十进制,十进制会先转二进制的无限不循环的数,再进行加减;
- 计算机可支持浮点数的小数部分可支持到52位。两者相加,再转换成十进制,得到的数有可能出现不准确的情况,加减乘除运算都是这样的原理。
解决:
- 将浮点数转为整数运算,再对结果做除法,再根据你的项目要求的精度取小数位
如 0.1 + 0.2,需要:
let num = ((0.1* 10 + 0.2 * 10) / 10).toFixed(1)
整数运算不可超过 MAX_SAFE_INTEGER (js 能精准表示的最大整数 Math.pow(2, 53),十进制即 9007199254740992)
number-precision 这个库就是使用的这种方案
如果整数运算会超过 MAX_SAFE_INTEGER,则
- 将浮点数转为字符串,模拟实际运算过程
使用以下库进行大整数运算
2021-12-01