zoukankan      html  css  js  c++  java
  • js中对小数的计算

    在js 的计算中如果涉及到小数的运算,那结果可不要想当然了,比如  0.1+0.2 的计算  

    var num1 = 0.1; 
     var num2 = 0.2;
    console.log(num1+num2)
    

     如果不加思考 那回答估计是 0.3  实际上的结果是 0.30000000000000004

    为什么会有这个结果呢

    首先,我们要站在计算机的角度思考 0.1 + 0.2 这个看似小儿科的问题。我们知道,能被计算机读懂的是二进制,而不是十进制,所以我们先把 0.1 和 0.2 转换成二进制看看:

    0.1==》0.1.toString(2)==》0.0001100110011(无限循环..)

    0.2==》0.2.toString(2)==》0.001100110011(无限循环..)

    双精度浮点数的小数部分最多支持 52 位,所以两者相加之后得到这么一串 0.0100110011001100110011001100110011001100110011001100 因浮点数小数位的限制而截断的二进制数字,这时候,我们再把它转换为十进制,就成了 0.30000000000000004。

    原来如此,那怎么解决这个问题呢?我想要的结果就是 0.1 + 0.2 === 0.3 啊!!!

    为了避免产生精度差异,我们要把需要计算的数字乘以 10 的 n 次幂,换算成计算机能够精确识别的整数,然后再除以 10 的 n 次幂,大部分编程语言都是这样处理精度差异的,我们就借用过来处理一下 JS 中的浮点数精度误差。

    formatNum = function(f, digit) { 
      var m = Math.pow(10, digit); 
      return parseInt(f * m, 10) / m; 
    } 
     var num1 = 0.1; 
     var num2 = 0.2;
    console.log(num1+num2)
    console.log(formatNum(num1 + num2, 1))
    

      

  • 相关阅读:
    input输入框与元素间有间隙
    显示3行,还要省略号(这个属性比较合适WebKit浏览器或移动端(绝大部分是WebKit内核的)浏览器)
    input file 修改按钮名称
    文本溢出处理
    移动WEB前端开发资源的一些素材
    带弹性的导航栏
    带重力的公告栏
    淘宝放大镜效果
    【规范】javascript 变量命名规则(转)
    常见的仿Flash图片轮播效果
  • 原文地址:https://www.cnblogs.com/buxiugangzi/p/12672014.html
Copyright © 2011-2022 走看看