当前位置 博文首页 > 无-题的博客:0.1+0.2!=0.3 一道令人记忆深刻的面试题

    无-题的博客:0.1+0.2!=0.3 一道令人记忆深刻的面试题

    作者:[db:作者] 时间:2021-08-08 13:06

    看到题是一脸懵逼的我,进入正题

    为什么0.1+0.2!=0.3?

    JavaScript 存储数值采用的是双精度浮点数,但是 JS 采用的浮点数标准会裁剪我们的数字

    eg:

    在定点数中,如果我们以8位二进制来存储数字。
    对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。
    对于纯小数来说,十进制的0.375会被存储为: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375

    对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011…由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。
    JS中采用的IEEE 754的双精度标准也是一样的道理在存储空间有限的情况下,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。

    由于0.1转换成二进制时是无限循环的,所以在计算机中0.1只能存储成一个近似值。另外说一句,除了那些能表示成 x/2^n 的数可以被精确表示以外,其余小数都是以近似值得方式存在的。

    point

    在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。 当然,也并非所有的近似值相加都得不到正确的结果。

    解决办法:

    parseFloat((0.1 + 0.2).toFixed(10)) === 0.3 //  true

    ?

    cs