js浮点数精度丢失和toFixed四舍五入不准问题
1. js的浮点数计算不准确替代方案
例如:
0.1 + 0.2 = 0.30000000000000004 // 应该是 0.3
替代方案
- big.js: 提供了十进制的计算,方法略少,但足够使用,体积最小。
- bignumber.js:提供了超高精度的数字处理能力,可以解决精度丢失问题。
- decimal.js:可以精确表示浮点数,解决精度丢失问题。
- number-precision: 可以做四舍五入,加减乘除各种运算。
- currency.js:货币格式化,优先使用 Intl.NumberFormat ,不行再使用此库。
2. toFixed四舍五入不准的替代方法
例如:
(2.005).toFixed(2) // '2.00', 应该是 2.01 (1.45).toFixed(1) // '1.4', 应该是 1.5
替代方案
//重写toFixed Number.prototype.toFixed=function(s) { const adjust = this >= 0 ? 0.5 : -0.5; return (parseInt(this * Math.pow( 10, s ) + adjust)/ Math.pow( 10, s )).toString(); } //toLocaleString function format(num, decimals){ return num.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2, useGrouping: false }) } //或者Intl.NumberFormat function format(num, decimals){ const formatter = new Intl.NumberFormat('en-US', { minimumFractionDigits: decimals, maximumFractionDigits: decimals, useGrouping: false }) return formatter.format(num) }
也可以直接使用上面的库来解决