日期:2014-05-16  浏览次数:20385 次

javascrip浮点数计算
我这里用两个函数进行计算时发现一个很怪的现象,当我输入0.7、7,0.7、7、或者0.3、9,0.9、3时计算结果会保留很长的一段数字。比如0.7、7时 结果为4.8999999999999995。
以下为用到的javascript函数代码:
function calsub(el,unitprice,firstper,secondper,subtotal,total){
  var tarel = el;
  var i = -1;
   
  do{
  if(tarel.parentElement){
  tarel = tarel.parentElement;
  }else{
  tarel = tarel.parentNode;
  }
  if(tarel.tagName == 'TR'){
  i = tarel.rowIndex;
  changeSubTotal(i,unitprice,firstper,secondper,subtotal,total);
  //changeTotal();
  break;
  }
  }while(i<0);
}

function changeSubTotal(i,unitprice,firstper,secondper,subtotal,total){
  var unitpriceObj = document.getElementsByName(unitprice);
  var firstperObj = document.getElementsByName(firstper);
  var secondperObj = document.getElementsByName(secondper);
  var subtotalObj = document.getElementsByName(subtotal);
  var totalObj = document.getElementById(total);

var unitValue = (unitprice==null || unitprice == '') ? 1 : unitpriceObj[i].value;
var firstValue = (firstper==null || firstper == '') ? 1 : firstperObj[i].value;
var secondValue = (secondper==null || secondper == '') ? 1 : secondperObj[i].value;
var subValue = (subtotal==null || subtotal == '') ? 1 : subtotalObj[i].value;
var totalValue = (total==null || total == '') ? 1 : totalObj.value;

if(unitValue!=null && unitValue!= '' && parseFloat(unitValue)>0 && 
firstValue!=null && firstValue!= '' && parseFloat(firstValue)>0 && 
secondValue!=null && secondValue!= '' && parseFloat(secondValue)>0 ){

subtotalObj[i].value = parseFloat(unitValue) * parseFloat(firstValue) * parseFloat(secondValue);

}else{
subtotalObj[i].value = 0 ;
}
var tt = 0;
for(var j=0; j<subtotalObj.length; j++){
if(subtotalObj[j].value !=null && subtotalObj[j].value != '' && parseFloat(subtotalObj[j].value)>0 )
tt = tt + parseFloat(subtotalObj[j].value);
}
totalObj.value = tt ; 
 
}
请大家帮忙找找问题。

------解决方案--------------------
把计算出来的值做下处理 加上toFixed(保留的位数)
------解决方案--------------------
这是javascript浮点数存储问题,在javascript中,变量存储时并不区分number和float类型,而是统一按float存储。而javascript使用IEEE 754 标准定义的64bit浮点格式存储number。可以参考
IEEE 754
比如,1.1-1=0.10000000000000009等等。简单的解决办法是固定小数位数。如:(1.1-1).toFixed(1)
复杂的做法是将浮点数转为整数再进行操作,如
1.1-1=(Math.round(1.1*10)-Math.round(1*10))/10=0.1