在javascript中,当我们做加法运算的时候,会发现,0.1 + 0.2 != 0.3 的情况,出现预期之外的结果是由什么造成的呢?
console.log(0.1 + 0.2);//0.30000000000000004
console.log(0.1 + 0.2 == 0.3);//false
javascript中的 number 类型就是浮点类型,浮点数采用的是一种二进制表示法,二进制浮点数表示法并不能精确的表示类似0.1这样的简单数字,会存在舍入的误差。
在二进制中,1/10(0.1)被表示为0.00110011001100110011……,0011是无限重复的,这是舍入误差造成的,所以对于 0.1 + 0.2 这样的运算,操作数会被先转成二进制,然后在运算:
0.1 => 0.0001 1001 1001 1001…(无限循环)
0.2 => 0.0011 0011 0011 0011…(无限循环)
所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100...因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.30000000000000004。
对于保证浮点数计算的正确性,有两种常见方式。
一、先升幂在降幂
functionadd(num1, num2){
let r1, r2, m;
r1 = (''+num1).split('.')[1].length;
r2 = (''+num2).split('.')[1].length;
m = Math.pow(10,Math.max(r1,r2));
return(num1 * m + num2 * m) / m;
}
console.log(add(0.1,0.2));//0.3
console.log(add(0.15,0.2256));//0.3756
二、使用内置的 toPrecision() 和 toFixed() 方法,注意:方法的返回值字符串
functionadd(x, y) {
returnx.toPrecision() + y.toPrecision()
}
console.log(add(0.1,0.2));//"0.10.2"