用 JavaScript 算钱时小心精度丢失!
用 js 计算带小数的加减法时遇到计算精度丢失,导致产生了无限小数。
这种情况常见地令人吃惊,随便用小数进行加减乘除都会出现这种问题:

对基本四则运算的理解在现代计算机面前受到了挑战。。。
产生浮点数计算精度不准确的原因:
- 计算机算的是二进制非十进制,十进制会先转二进制的无限不循环的数,再进行加减;
 - 计算机可支持浮点数的小数部分可支持到52位。两者相加,再转换成十进制,得到的数有可能出现不准确的情况,加减乘除运算都是这样的原理。
 
解决:
- 将浮点数转为整数运算,再对结果做除法,再根据你的项目要求的精度取小数位
如 0.1 + 0.2,需要: 
let num = ((0.1* 10 + 0.2 * 10) / 10).toFixed(1)
我在的公司后端要求,涉及到钱的数字是以分为单位的整数。那么:
- 显示时:获取后端数据 num --> 算成元为单位,保留两位小数(num / 100).toFixed(2) --> 填充到模板
 - 计算用户输入的钱:获取用户数据的钱(以元为单位的)num --> num 乘以100,变成以分为单位,做整数运算 --> 发给后端
 
整数运算不可超过 MAX_SAFE_INTEGER (js 能精准表示的最大整数 Math.pow(2, 53),十进制即 9007199254740992)
number-precision 这个库就是使用的这种方案
如果整数运算会超过 MAX_SAFE_INTEGER,则
- 将浮点数转为字符串,模拟实际运算过程
 
使用以下库进行大整数运算
bignumber.js
decimal.js
big.js
2021-12-01
                    
                
                
            
        
浙公网安备 33010602011771号