代码改变世界

【JavaScript】js中的小数计算学问大-》注意误差

2010-09-26 18:04  Peter Jin  阅读(984)  评论(0编辑  收藏  举报
 在js中,带小数的数据相加或相乘时总会出现好多位小数。例如100.11+100.02=200.130000001类似的情况。这是因为在js中浮点数的计算是以2进制算的,解决方法一般是将小数化成整数后再作除法。如上例中:(100.01*100+100.02*100)/100 。

以下是可用的JS小数计算函数和例子:

<form name="inputform">
<input type="text" name="a1">
<input type="text" name="a2">
<input type="button" value="累加" onclick="add()">
</form>
<script>
function add()
{
   var num1=parseFloat(document.getElementsByName("a1")[0].value);
   var num2=parseFloat(document.getElementsByName("a2")[0].value);
   document.getElementsByName("a1")[0].value=yunshuan(num1,"*",num2);
}
function   yunshuan(a,how,b){//正确浮点运算  
                  if(a.toString().indexOf(".")   <   0   &&   b.toString().indexOf(".")   <   0){//没小数  
                        return   eval(a   +   how   +   b);  
                  }  
                  //至少一个有小数  
                  var   alen   =   a.toString().split(".");  
                  if(alen.length   ==   1){//没有小数  
                      alen   =   0;  
                  }else   {  
                          alen   =   alen[1].length;  
                    }  
                  var   blen   =   b.toString().split(".");  
                  if(blen.length   ==   1){  
                      blen   =   0;  
                  }else   {  
                          blen   =   blen[1].length;  
                    }  
                  if(blen   >   alen)alen   =   blen;  
                  blen   =   "1";
                  for(;alen   >   0;   alen--){//创建一个相应的倍数  
                              blen   =   blen   +   "0";
                  }
                  switch(how){  
                        case   "+":  
                                      return   (a   *   blen   +   b   *   blen)   /   blen;  
                                break;  
                        case   "-":  
                                      return   (a   *   blen   -   b   *   blen)   /   blen;  
                                break;  
                        case   "*":  
                                      return   ((a   *   blen)   *   (b   *   blen))   /   (blen   *   blen);  
                                break;  
                        default:  
                                alert("你要求的\t"   +   how   +   "\t运算未完成!");  
                                return   eval(a   +   how   +   b);  
                  }  
}  

</script>