# 一、问题:0.1 + 0.2 != 0.3
在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。
# 三、解决方案
对于保证浮点数计算的正确性,有两种常见方式。
- 先升幂在降幂
function add(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()方法,注意:方法的返回值字符串
function add(x, y) {
return x.toPrecision() + y.toPrecision()
}
console.log(add(0.1,0.2));//"0.10.2"