js浮点数的计算

浮点数是算不准的,不同的语言环境里有不同的解决方案.

这里列一下我在前端遇到过的情况和对应处理

刚开始我试过一个错误的办法

        total=total+price;
	total=total.toString();
	if(total.lastIndexOf(‘.‘)==-1){
	  total=total;
	}else{
	  total=total.substr(0,total.lastIndexOf(‘.‘)+3);
	}
	total=parseFloat(total);//因为浮点数总会出现类似这种0.3+01=0.40000000001之类的错误,所以我直接总是取两位小数,去掉后面的一大串@%*G$%#FF&^$$&%//看起来很简单,正是因为处理方式太多简单粗暴,错误很快发现了 类似0.06+0.01=0.699999999,业务里是price,可见这种显示错误是很难让人容忍的,为什么0.06+0.01不能得到0.07,//若是购买多个累加时会变成误差多少? 

所以还是寻求其它的处理方式,比如四舍五入,比如扩大倍数后计算后再缩小相应倍数...

我用了一个网友的解决方案,目前测试多次后没有发现类似以上不能容忍的bug..

//加法function f_add(arg1,arg2){
        var r1, r2, m, c;
        try {
            r1 = arg1.toString().split(".")[1].length;
        }
        catch (e) {
            r1 = 0;
        }
        try {
            r2 = arg2.toString().split(".")[1].length;
        }
        catch (e) {
            r2 = 0;
        }
        c = Math.abs(r1 - r2);
        m = Math.pow(10, Math.max(r1, r2));
        if (c > 0) {
            var cm = Math.pow(10, c);
            if (r1 > r2) {
               arg1 = Number(arg1.toString().replace(".", ""));
               arg2 = Number(arg2.toString().replace(".", "")) * cm;
            } else {
               arg1 = Number(arg1.toString().replace(".", "")) * cm;
               arg2 = Number(arg2.toString().replace(".", ""));
            }
        } else {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", ""));
        }
        return (arg1 + arg2) / m;
}

//减法function f_sub(arg1,arg2){
        var r1, r2, m, n;
        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)); //last modify by deeka //动态控制精度长度
        n = (r1 >= r2) ? r1 : r2;
        return ((arg1 * m - arg2 * m) / m).toFixed(n);

}
//乘法function f_times(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();

    try {
         m += s1.split(".")[1].length;
    }
    catch (e) {
    }
    try {
        m += s2.split(".")[1].length;
    }
    catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}
//除法function f_slash(arg1, arg2) {

    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
    }
    catch (e) {
    }
    try {
        t2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {
    }
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return (r1 / r2) * pow(10, t2 - t1);
    }
}

参考:http://www.cnblogs.com/binjoo/archive/2012/09/10/2679151.html

时间: 2024-10-29 18:05:48

js浮点数的计算的相关文章

js浮点数的计算总结

在js浮点值的计算中,很多时候会出现不准确的情况,如下面的情况 console.log(2.2 + 2.1) // 4.300000000000001 console.log(2.2 - 1.9) // 0.30000000000000027 console.log(2.2 * 2.2) // 4.840000000000001 console.log(2.1 / 0.3) // 7.000000000000001 console.log(10 - 9.99) // 0.009999999999

解决JS浮点数(小数)计算加减乘除的BUG

/**  ** 加法函数,用来得到精确的加法结果  ** 说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果.  ** 调用:accAdd(arg1,arg2)  ** 返回值:arg1加上arg2的精确结果  **/ function accAdd(arg1, arg2) {     var r1, r2, m, c;     try {         r1 = arg1.toString().split(".")[1].

js浮点数精确计算(加、减、乘、除)

<SPAN style="FONT-SIZE: 18px">//说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1,arg2){ var r1,r2,m; try{r1=arg1.toString().split(".")[1].length}catch(e){r

js浮点数算术出现多为小数

/****************************************解决JS浮点数(小数)计算加减乘除的BUG Start****************************************/ 问题:js浮点数运算问题---莫名出现多位小数 // 原因:这是由于在运算的时候先把浮点数转化成二进制后进行运算,// 但是有的小数在二进制编码后出现无限循环,// 因而导致计算出现了误差,在其它变成语言中也有类似的问题. /**** 加法函数,用来得到精确的加法结果** 说明:

js浮点数计算(加,减)

最近工作中经常遇到需要处理浮点型计算的问题,开始一直都在用把浮点数先乘以10的对应小数的位数的次方化成整数再去开始计算. 例如100.01+100.02,可以化成(100.01*100+100.02*100)/100来做计算,但是最近发一个浮点数乘以一个10的次方也会有精度问题发生,突然感觉前面的工作是不是有好多地方埋了很多坑啊,不能愉快的工作啦. 正好周未没什么别的计划,想研究下怎么处理JS的浮点型计算的精度问题 既然浮点数的计算精度有问题,那何不就在计算过程中绕过浮点型的计算了,于是有如下思

关于js浮点数计算精度不准确问题的解决办法

今天在计算商品价格的时候再次遇到js浮点数计算出现误差的问题,以前就一直碰到这个问题,都是简单的使用tofixed方法进行处理一下,这对于一个程序员来说是及其不严谨的.因此在网上收集了一些处理浮点数精度的文章.觉得别人写的挺好了,我在简单的总结一下,以方便后续查阅. 浮点数误差产生的原因: 先看一个实例: 0.1 + 0.2 =? 0.1 + 0.2 = 0.3? 我们先来看一段 JS. console.log( 0.1+ 0.2); 输出为 0.30000000000000004.是不是很奇葩

js浮点数计算问题 + 金额大写转换

一 js浮点数计算问题解决方案: 1.使用 NumberObject.toFixed(num) 方法 toFixed() 方法可把 Number 四舍五入为指定小数位数的数字. 2.较精度计算浮点数 //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显.这个函数返回较为精确的加法结果. //调用:accAdd(arg1,arg2) //返回值:arg1加上arg2的精确结果 function accAdd(arg1, arg2) { var r1, r2, m; t

js浮点数相加、减、乘、除精确计算

js 浮点数计算时 ,无缘无辜 后边冒出一堆 小数点………… 貌似js本身的问题,类型不定?????? 只能自己写函数处理..  http://blog.csdn.net/w4bobo/article/details/9143663 借鉴一下 1 //调用:accAdd(arg1,arg2) 2 //返回值:arg1加上arg2的精确结果 3 function accAdd(arg1,arg2){ 4 var r1,r2,m; 5 try{r1=arg1.toString().split(".&

js浮点数乘除法

JS在处理浮点数计算时经常会遇到精度的问题,上一篇博客封装了JS浮点数加减法的方法,这一次来封装一下js浮点数乘除法运算. 其实浮点除法的封装跟加减法的封装原理是一样,只是在第一次计算完后会再复位小数位数的时候稍微会复杂一点. 加法运算在第一次清除小数点计算后,根据小数位数的最大值可以知道计算后的结果应该再复位多少位小数. 而乘除法运算得分二种情况: 乘法运算时,二个数去掉小数点,相当于放大了10的对应二数小数点位数的和的次幂,所以计算完后的结果应该保留至少对应小数位数的和的位数; 除法运算时,