精度丢失问题存在于浮点数转化为ieee754标准的二进制数的过程中
number类型
js中的number类型采用双精度浮点型,基于ieee754标准
进制表示
- 二进制:0b或0B
- 八进制:es5严格模式禁止使用,es6使用0o为前缀表示(0o777)
- 十六进制:0X或0x
- 十进制
进制转换
parseInt,toString
解决方案
- 使用toFixed限制精度
(0.1+0.2).toFixed(5)
toFixed四舍五入存在精度问题(银行家舍入规则)
// 实际上,round,ceil,floor都存在该问题
2.335.toFixed(2) // 2.33
解决方案:
function getAccuracyNum(num, digit) {
const precision = Math.pow(10, digit);
return Math.round((num + Number.EPSILON) * precision) / precision;
}
- 使用第三方库,例如big number.js,decimal.js,big.js
补充说明:大数精度问题,指超出js最大安全整数范围的数值