zoukankan      html  css  js  c++  java
  • js 浮点数计算精确度不准确的解决方案

    原博文地址:https://www.cnblogs.com/zdz8207/p/js-number-tofixed.html

    12*1.2 != 14.4 得到14.3999999

    0.1+0.2 != 0.3 得到0.30000000000000004

    为什么会这样呢?

    原来js在计算浮点数时会先把浮点数转换成二进制,其中会出现误差,相加完再转换乘十进制时又会出现误差,吧啦吧啦吧啦,大概是这个原因吧,不重要,重要的是解决方案,下面是加减乘除的解决方法,核心原理是将浮点数转换成整数,再转换成浮点数。

    下面给出具体方法

    const computeFloat = {
      getDigits (num1, num2) {
        let d1, d2
        let d1Arr = (num1 + '').split('.')[1]
        let d2Arr = (num2 + '').split('.')[1]
        d1 = d1Arr ? d1Arr.length : 0
        d2 = d2Arr ? d2Arr.length : 0
        return { d1, d2 }
      },
      compute (num1, num2, type) {
        let { d1, d2 } = this.getDigits(num1, num2)
        switch (type) {
          case 'add':
            return this.add(num1, num2, d1, d2)
          case 'subtract':
            return this.subtract(num1, num2, d1, d2)
          case 'multiply':
            return this.multiply(num1, num2, d1, d2)
          case 'divide':
            return this.divide(num1, num2, d1, d2)
        }
      },
      add (num1, num2, d1, d2) {
        let m = Math.pow(10, Math.max(d1, d2))
        return (num1 * m + num2 * m) / m
      },
      subtract (num1, num2, d1, d2) {
        let m = Math.pow(10, Math.max(d1, d2))
        return (num1 * m - num2 * m) / m
      },
      multiply (num1, num2, d1, d2) {
        let m = Math.pow(10, d1 + d2)
        return ((num1 + '').replace('.', '')) * ((num2 + '').replace('.', '')) / m
      },
      divide (num1, num2, d1, d2) {
        let m = Math.pow(10, d2-d1)
        return ((num1 + '').replace('.', '')) / ((num2 + '').replace('.', '')) * m
      }
    }

    使用的时候是这样的:

    加:

    computeFloat.compute(0.1,0.2,'add')

     当然,如果对结果精确度要求不严格,可以用toFixed,保留指定小数位

  • 相关阅读:
    关于document.referrer的使用需要注意
    Vue2.0表单校验组件vee-validate的使用
    Ubuntu 20.04 Docker 安装并配置
    换硬盘,装win10系统小记
    关于MongoDB ObjectId的那些事儿
    水平垂直居中常见解决方案
    JSON基础知识总结
    css选择器中:first-child与:first-of-type的区别
    基于jQuery选择器的整理集合
    DOM对象与jquery对象有什么不同
  • 原文地址:https://www.cnblogs.com/lijianjian/p/10758046.html
Copyright © 2011-2022 走看看