js中的精度问题 0.1+ 0.2 != 0.3

308 阅读1分钟
1,  为什么使用浮点数计算不安全?

在计算机中,数据都是以二进制存储在计算机的内存中,js中的数字是以IEEE754的标准,使用64位双精度浮点型来表示。其中符号位S,指数位E,尾数位M分别占了1,11,52位,并且在ES5规范中指出了指数位E的取值范围是[-1074, 971]。因为精度(precision)有限,所以所有的浮点数都是不安全的。  0.1+0.2  = 0.30000000000000004

2, 解决方案:

  •  当要求不是特别精确时(允许有误差),可以使用 四舍五入
  •  将小数转换成整数,计算完结果在 *e^-n  缩小回去
  •  把小数转换成字符串,将字符串模拟 数字
  •  &&  使用mathjs 解决精度问题

var math = require('mathjs')
function printFn(value) {
    const precision = 14
    return Number(math.format(value, precision))
}

console.log(printFn(0.1+0.2) == 0.3);
console.log(0.1*0.2);