美文网首页
javascript关于小数计算的Bug

javascript关于小数计算的Bug

作者: meng_281e | 来源:发表于2018-09-15 17:56 被阅读0次

    7*0.8=5.6000000000000005
    1.22+2.111=3.3310000000000004

    为什么操作小数会出现误差?

    一个有趣的测试:
    0.1+0.2 == 0.3 //false

    浮点数值的最高进度是17位小数,但在进行运算的时候其精确度却远远不如整数;整数在进行运算的时候都会转成10进制; 而Java和JavaScript中计算小数运算时,都会先将十进制的小数换算到对应的二进制,一部分小数并不能完整的换算为二进制,这里就出现了第一次的误差。待小数都换算为二进制后,再进行二进制间的运算,得到二进制结果。然后再将二进制结果换算为十进制,这里通常会出现第二次的误差。
    所以(0.1+0.2)!=03

    解决方式:

    1.toFixed()

    是小数点后指定位数取整,从小数点开始数起。

    2.toPrecision()

    是处理精度,精度是从左至右第一个不为0的数开始数起。

    这两种方法都是存在bug的

    3.toPrecision 凑整并 parseFloat 转成数字后再显示

    当你拿到 1.4000000000000001 这样的数据要展示时,建议使用 ,如下:
    parseFloat(1.4000000000000001.toPrecision(12)) === 1.4 // True
    封装成方法就是:
    function strip(num, precision = 12) {
    return +parseFloat(num.toPrecision(precision));
    }
    为什么选择 12 做为默认精度?这是一个经验的选择,一般选12就能解决掉大部分0001和0009问题,而且大部分情况下也够用了,如果你需要更精确可以调高。

    相关文章

      网友评论

          本文标题:javascript关于小数计算的Bug

          本文链接:https://www.haomeiwen.com/subject/rtjtnftx.html