retech-fe / fe-interview-questions

0 stars 0 forks source link

2.45.toFixed(1)和2.55.toFixed(1)为什么都等于2.5 #22

Open zuopf769 opened 1 year ago

zuopf769 commented 1 year ago
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 是四舍五入么?为啥2.45进了一位?2.55就没进位
        // toFixed先运算再显示,运算和现实都不精确
        console.log(2.45.toFixed(1))  // 2.5 
        console.log(2.55.toFixed(1))  // 2.5

        // js中数字的运算是不精确的
        // 存储不精确
        // 运算不精确?因为存储不精确会导致运算不精确
        // 显示不精确

        // 为什么大于0.3
        console.log(0.1 + 0.2); // 0.30000000000000004

        // 存储不精确
        // 计算机中的数字是以二进制存储的
        console.log(0.2.toString(2)) // 0.001100110011001100110011001100110011001100110011001101 后面肯定还有很多位,应该是舍或者入了
        // 0.2的二进制是0011一直重复,但是达到能存储的最大位数后就需要对后面的位数进行舍入(进位或者舍弃后面的二进制位数)
        // / 0.00110011001100 1100 后面是1就进1后面是0就舍弃后面的
        console.log(0.2.toPrecision(20)) // 0.20000000000000001110 0.2后面还有几位

        // 0.20000000000000000001 == 0.19999999999999999999 true
        console.log(0.20000000000000000001.toString(2)) 
        console.log(0.19999999999999999999.toString(2))
        console.log(0.20000000000000000001 == 0.19999999999999999999) // true

        // 运算不精确;运算是二进制运算的
        console.log(0.2 + 0.3); // 0.5 0.2不是不精确么?为啥0.2+0.3又精确了
        console.log(0.1 + 0.2); // 0.30000000000000004 不精确
        console.log(0.5.toString(2)) // 精确
        console.log(0.1.toString(2)) // 最后一位进行了入操作
        console.log(0.2.toString(2)) // 0.001100110011001100110011001100110011001100110011001101
        // 最后一位进行了入操作 0.2存储的稍微大了
        console.log(0.3.toString(2)) // 0.010011001100110011001100110011001100110011001100110011
        // 0.3 后的舍弃了 0.3存储的稍微小了
        // 0.2 + 0.3正好抵消了,一个稍微大了(入),一个稍微小了(舍),一抵消就正好精确了

        // 0.3舍 0.2进 所以0.3 - 0.2 只能是小于0.1, 不到0.1
        console.log(0.3 - 0.2) // 0.09999999999999998

        // 0.2进 0.3舍  所以 0.2 - 0.3  会大于-0.1
        console.log(0.2 - 0.3) // -0.09999999999999998

        // 并不是所有的数字存储都不精确
        console.log(0.25 + 0.125);
        console.log(0.25.toString(2)) // 精确存储
        console.log(0.125.toString(2))// 精确存储

        // 显示不精确
        var a = 0.2; // 0.2的存储是不精确的
        console.log(a); // 为什么a能正常的显示呢
        // 显示的时候也是不精确的,显示的时候也做了近似处理
        // 那么猥琐0.1+0.2就不做近似处理了呢?因为误差被放大了;二进制计算后已经不知道是0.1+0.2了,只能返回了放大后的结果
        console.log(a.toPrecision(100))

        // toFixed先运算再显示,运算和现实都不精确
        console.log(2.45.toFixed(1))  // 2.5 
        console.log(2.55.toFixed(1))  // 2.5

        // toPrecision表示10机制的多少位表示方法
        console.log(2.45.toPrecision(100)) // 2.450000000000000177635683940025046467781066894531250000000000000000000000000000000000000000000000000
        console.log(2.55.toPrecision(100)) // 2.549999999999999822364316059974953532218933105468750000000000000000000000000000000000000000000000000
        console.log(2.45.toString(2)) // 进
        console.log(2.55.toString(2)) // 舍

    </script>
</body>
</html>