zoukankan      html  css  js  c++  java
  • Javascript的计算精度问题

    Javascript的计算精度问题,这个一不注意就容易对我们的项目产生或大或小的影响。所以我们需要了解下Javascript计算精度问题产生的原因 及一些解决办法。
     
    产生的原因
      接下来我们看一个列子:  
      
      看到这里,是不是有点和我们想的不一样。这应该是相等,但为什么不相等呢?
      
    原来,在Javascript中 0.1 + 0.2 == 0.30000000000000004,这就是因为 Javascript的计算精度 而引起。 因为在计算 0.1+0.2 时,因为计算机能读懂的是二进制,所以计算机会将0.1和0.2转化为二进制。
     
      
     
    解决方法

      数据展示类

    当我们拿到类似于0.30000000000000004这样的数据时,可以使用 toPrecision() 方法凑整后用 parseFloat() 方法转化为数字后再显示。
            console.log(parseFloat((0.1 + 0.2).toPrecision(12)) === 0.3);  // true
          
      可以将其封装成一个方法:
            function strip(num,precision = 12) {
                   return parseFloat(num,toPrecision(precision))
                }
          
      对于选用12作为默认精度,是因为能解决掉大部分的0001和0009这样的问题,大部分情况下够用了,当然也可以 传入想要的精度。

      数据运算类

    对于运算类操作,如 +-*/ ,就不能使用 toPrecision 了。可以把小数转化为整数后再运算。如加法:
            function add(num1,num2){
                   const num1Digits = (num1.toString().split(".")[1] || "").length;
                   const num2Digits = (num2.toString().split(".")[1] || "").length;
                   const baseNum = Math.pow(10,Math.max(num1Digits,num2Digits));
                   return (num1 * baseNum + num2 * baseNum) / baseNum;
                }
          
      以上方法能适用大部分场景。也有局限性,如果遇到科学计数法:2.3e+1 时还需要做处理。
  • 相关阅读:
    android dumpsys meminfo 详解
    效率思维模式与Zombie Scrum
    Mac中Run快捷键修改
    airtest+pytest实战教程05—登录智学网app
    对select函数的理解
    Appium定位元素
    Hack The Box——ServMon
    Oracle DG常用视图与运维护常用操作
    Oracle EBS订单的流程(Order->AR)
    财经法规与会计职业道德
  • 原文地址:https://www.cnblogs.com/aloneer/p/13604079.html
Copyright © 2011-2022 走看看