zoukankan      html  css  js  c++  java
  • Nodejs学习笔记(十七)—浮点运算decimal.js

    前言

       开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰

       JavaScript 只有一种数字类型 ( Number )

       JavaScript采用 IEEE 754 标准双精度浮点(64),64位中 1位浮点数中符号,11存储指数,52位存储浮点数的有效数字

       有时候小数在二进制中表示是无限的,所以从53位开始就会舍入(舍入规则是0舍1入),这样就造成了“浮点精度问题”(由于舍入规则有时大点,有时小点)

        下面用示例来看看

     

    JavaScript加减乘除运算

      加法

     

    var a = 0.1;
    var b = 0.2;
    console.log('0.1 以二进制表示:', a.toString(2));
    console.log('0.2 以二进制表示:', b.toString(2));
    console.log('直接加法运算 0.1 + 0.2 =', a + b);

      示例: 0.1 + 0.2 

      预期结果:0.3

      实际结果:0.30000000000000004

     减法

     

    var a = 1.0;
    var b = 0.7;
    console.log('1.0 以二进制表示:', a.toString(2));
    console.log('0.7 以二进制表示:', b.toString(2));
    console.log('直接减法运算 1.0 - 0.7 =', a - b);

      示例: 1.0 - 0.7 

      预期结果:0.3

      实际结果:0.30000000000000004

     乘法

      

    var a = 1.01;
    var b = 1.003;
    console.log('1.01 以二进制表示:', a.toString(2));
    console.log('1.003 以二进制表示:', b.toString(2));
    console.log('直接乘法运算 1.01 * 1.003 =', a * b);

      示例: 1.01 * 1.003

      预期结果:1.01303

      实际结果:1.0130299999999999

     除法

     

    var a = 0.029;
    var b = 10;
    console.log('0.029 以二进制表示:', a.toString(2));
    console.log('10 以二进制表示:', b.toString(2));
    console.log('直接除法运算 0.029 / 10 =', a / b);

      示例: 0.029 / 10

      预期结果:0.0029

      实际结果:0.0029000000000000002

    说明:以上加、减、乘、除示例分别演示了JavaScript运算结果(当然实际结果并不是我们想要的),为什么会出现这样的结果,前言中已经说明^_^!

    decimal.js加减乘除运算

    An arbitrary-precision Decimal type for JavaScript

           GITHUB:  https://github.com/MikeMcl/decimal.js

          API:  http://mikemcl.github.io/decimal.js/

          NPM:  https://www.npmjs.com/package/decimal.js

     先安装decimal.js

    npm install --save decimal.js

     把上面的示例,用decimal.js运算一次,对比一下结果

     

    var Decimal = require('decimal.js');
    
    //加法
    var a = 0.1;
    var b = 0.2;
    console.log('直接加法运算 a + b =', a + b);
    console.log('Decimal.js加法运算 a + b =',  new Decimal(a).add(new Decimal(b)).toNumber());
    
    //减法
    var a = 1.0;
    var b = 0.7
    console.log('直接减法运算 a - b =', a - b);
    console.log('Decimal.js减法运算 a - b =',  new Decimal(a).sub(new Decimal(b)).toNumber());
    
    //乘法
    var a = 1.01;
    var b = 1.003;
    console.log('直接乘法运算 a * b =', a * b);
    console.log('Decimal.js乘法运算 a * b =',  new Decimal(a).mul(new Decimal(b)).toNumber());
    
    //除法
    var a = 0.029;
    var b = 10;
    console.log('直接除法运算 a / b =', a / b);
    console.log('Decimal.js除法运算 a / b =',  new Decimal(a).div(new Decimal(b)).toNumber());

      从图中可以看结果一目了然^_^!

    说明: “浮点问题”不算是问题,它一直就是这样,也不是JavaScript独有的, 所以这个锅不应该它背^_^!

    此系列的源代码可到http://bijian1013.iteye.com/blog/2425085下载。 

    文章来源:https://www.cnblogs.com/zhongweiv/p/nodejs_decimal.html

  • 相关阅读:
    java web项目打包.war格式
    version 1.4.2-04 of the jvm is not suitable for thi
    Sugarcrm Email Integration
    sharepoint 2010 masterpage中必须的Content PlaceHolder
    微信开放平台
    Plan for caching and performance in SharePoint Server 2013
    使用自定义任务审批字段创建 SharePoint 顺序工作流
    Technical diagrams for SharePoint 2013
    To get TaskID's Integer ID value from the GUID in SharePoint workflow
    how to get sharepoint lookup value
  • 原文地址:https://www.cnblogs.com/flyingeagle/p/9193234.html
Copyright © 2011-2022 走看看