zoukankan      html  css  js  c++  java
  • JS 浮点计算BUG

    最近做项目的时候遇到一个比较纠结的js浮点计算问题。

    当时是做利率计算,因为利率大多数涉及到小数点,精度要求也很高。

    0.6+0.1+0.1=?

    结果出现:0.7999999999999

    网上查找了一下,这确实是一个缺陷(Bug)

    不仅加,只要涉及到浮点计算减成除一样会出现类似情况

    先看看Demo:

    将0.1~10,加0.1+0.1  进行测试

    1         $(function () {
    2             var content = "";
    3             for (var i = 0.1; i <= 10; i += 0.1) {
    4                 var result = i + 0.1 + 0.1;
    5                 content = content + result + '	';
    6             }
    7             alert(content);
    8         });

    运行结果:

    解决方法:

    根据tofixed方法,我们修改一下,修改一个toRound方法,可对小数点精准四舍五入:

     1         Number.prototype.toRound = function(d)
     2         {
     3             var s=this+"";if(!d)d=0;
     4             if(s.indexOf(".")==-1)s+=".";s+=new Array(d+1).join("0");
     5             if (new RegExp("^(-|\+)?(\d+(\.\d{0,"+ (d+1) +"})?)\d*$").test(s))
     6             {
     7                 var s="0"+ RegExp.$2, pm=RegExp.$1, a=RegExp.$3.length, b=true;
     8                 if (a==d+2){a=s.match(/d/g); if (parseInt(a[a.length-1])>4)
     9                 {
    10                     for(var i=a.length-2; i>=0; i--) {a[i] = parseInt(a[i])+1;
    11                         if(a[i]==10){a[i]=0; b=i!=1;} else break;}
    12                 }
    13                     s=a.join("").replace(new RegExp("(\d+)(\d{"+d+"})\d$"),"$1.$2");
    14                 }if(b)s=s.substr(1);return (pm+s).replace(/.$/, "");} return this+"";
    15         };   

    改一下Demo中的方法,调用toRound方法:

        var result = (i+0.1+0.1).toRound(2);
    

    结果:

     

    
    

     

      

  • 相关阅读:
    js中图片上传,多次上传同一张不生效
    mysql统计一年12月的数据
    jquery.qrcode.js 生成二维码并支持中文的方法
    layui 的 GitHub 及 Gitee (码云) 仓库
    枚举应用demo
    第十二节 线性回归:波士顿房价预测
    第十二节 gevent多任务
    第十一节 yield实现多任务
    第十节 next和send取生成器的值
    第九节 生成器
  • 原文地址:https://www.cnblogs.com/yangda/p/5001278.html
Copyright © 2011-2022 走看看