zoukankan      html  css  js  c++  java
  • js 数值精确运算使用math.js

    javaScript 浮点数运算的精度问题

    问题:编程中你可能会遇到0.1*7=0.7000000000000001;

    原因:几乎所有的编程语言都采用了 IEEE-745 浮点数表示法,任何使用二进制浮点数的编程语言都会有这个问题,只不过在很多其他语言中已经封装好了方法来避免精度的问题,而 JavaScript 是一门弱类型的语言,从设计思想上就没有对浮点数有个严格的数据类型,所以精度误差的问题就显得格外突出。

    解决: 

    1.对于普通数据计算可以用 toFix(2)截取;

    2. 常用方法: 把需要计算的数字升级(乘以10的N次幂)成计算机能够识别的整数,等计算完毕后再降级(除以10的N次幂),这是大部分变成语言处理经度差异的通用方法;

    function accAdd(arg1,arg2){

      var r1,r2,m;
      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
      m=Math.pow(10,Math.max(r1,r2))
      return (arg1*m+arg2*m)/m
    }
    //给Number类型增加一个add方法,调用起来更加方便。
    Number.prototype.add = function (arg){
      return accAdd(arg,this);
    }
     

    3.对于金额这种要求严格的经度计算推荐使用math.js:

    http://mathjs.org/examples/bignumbers.js.html

    math.config({
      number: 'BigNumber',  // Default type of number:
                            // 'number' (default), 'BigNumber', or 'Fraction'
      precision: 20         // Number of significant digits for BigNumbers
    });


    参考文献:http://mathjs.org/examples/bignumbers.js.html

  • 相关阅读:
    Python笔记2(数据类型)
    Python笔记1(作业)
    Python笔记1(内容编码)
    Linux内核分析——第三周学习笔记
    Linux内核分析——第二周学习笔记
    Linux内核分析——第一周学习笔记
    day19-三元表达式,函数递归
    day18-有参装饰器
    day17-无参装饰器
    day16-函数对象,函数嵌套,闭包函数
  • 原文地址:https://www.cnblogs.com/juneling/p/8548577.html
Copyright © 2011-2022 走看看