javascript中做減法時,出現小數位增加bug

bill1315發表於2013-02-06

地址:http://www.iteye.com/problems/92347

這個bug是js固有的,浮點數精度不準,你可以用下面方法來解決,思路是先放大,求和、差、積等運算後再縮小。 

如: 
//加法函式,用來得到精確的加法結果 
//說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函式返回較為精確的加法結果。 
//呼叫:accAdd(arg1,arg2) 
//返回值:arg1加上arg2的精確結果 
function accAdd(arg1, arg2) { 
    var r1, r2, m; 
    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)) 
    return (arg1 * m + arg2 * m) / m 
} 
//給Number型別增加一個add方法,呼叫起來更加方便。 
Number.prototype.add = function(arg) { 
    return accAdd(arg, this); 
} 

//減法函式,用來得到精確的減法結果 
//說明:javascript的減法結果會有誤差,在兩個浮點數相減的時候會比較明顯。這個函式返回較為精確的加法結果。 
//呼叫:accSub(arg1,arg2) 
//返回值:arg1減去arg2的精確結果 

function accSub(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)); 
    n = (r1 >= r2) ? r1 : r2; 
    return ((arg1 * m - arg2 * m) / m).toFixed(n); 
} 
//給Number型別增加一個sub方法,呼叫起來更加方便。 
Number.prototype.sub = function(arg) { 
    return accSub(arg, this); 
}

相關文章