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 时还需要做处理。
  • 相关阅读:
    spring容器启动
    springmvc流程
    bean作用域
    bean的生命周期
    web.xml详解
    设计模式 工厂和抽象工厂
    requests 模块
    爬虫基础
    提高级
    循环语句
  • 原文地址:https://www.cnblogs.com/aloneer/p/13604079.html
Copyright © 2011-2022 走看看