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