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"

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容