js浮点数运算精度丢失

156 阅读1分钟

精度丢失问题存在于浮点数转化为ieee754标准的二进制数的过程中

number类型

js中的number类型采用双精度浮点型,基于ieee754标准

进制表示

  • 二进制:0b或0B
  • 八进制:es5严格模式禁止使用,es6使用0o为前缀表示(0o777)
  • 十六进制:0X或0x
  • 十进制

进制转换

parseInt,toString

解决方案

  1. 使用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;
}


  1. 使用第三方库,例如big number.js,decimal.js,big.js

补充说明:大数精度问题,指超出js最大安全整数范围的数值