JavaScript:浮点运算

在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"

你可能感兴趣的:(JavaScript:浮点运算)