js在計算浮點數時可能不夠準確,會產生捨入誤差的問題,這是使用基於ieee745數值的浮點計算的通病,並非ecmascript一家,其他使用相同數值格式的語言也存在這個問題。
這裡講一下js浮點數加、減、乘、除的正確做法。
整數的乘法運算是準確的,這裡我們將浮點數的乘法運算轉化為整數乘法,然後除以10的他們小數字數之和次方,如0.03
乘以0.05
,轉化為3 * 5 / 1e4
//乘法運算 0.03 * 0.05 變成3 * 5 / 10^4
function mul(a, b) catch (f) {}
try catch (f) {}
return (+c.replace('.', '')) * (+d.replace('.', '')) / math.pow(10, n);
}
這裡我們將浮點數分別乘以小數字最大的之後,再相加,然後除以10的小數字數最大的次方,如0.03
加上0.5
,轉化為3 + 50 / 1e2
//加法運算
function add(a, b) catch(f)
try catch(f)
return e = math.pow(10, math.max(c, d)), (a * e + b * e)/ e;
}
同加法,如0.03
減去0.5
,轉化為3 - 50 / 1e2
//除法運算
function sub(a, b) catch(f)
try catch(f)
return e = math.pow(10, math.max(c, d)), (a * e - b * e) / e;
}
也類似加法,將兩個數各自乘以10的他們小數字最大的次方,再相除,然後乘以1e(除數小數字 - 被除數小數字)
如0.03
除以0.5
,轉化為3 / 50
再乘以1e-1
//除法運算
function dev(a, b) catch (f)
try catch (f)
return e = (a + '').replace('.', '') , f = (b + '').replace('.', ''), mul(e / f, math.pow(10, d - c));
}
測試**:
console.log(sub(0.03, 0.5));
console.log(add(0.03, 0.5));
console.log(mul(0.03, 0.5));
console.log(dev(0.03, 0.5));
輸出結果 :
浮點數計算
bigdecimal工具類封裝 public class bigdecimaltool 提供精確的減法運算。param v1 被減數 param v2 減數 return 兩個引數的差 public static double sub double v1,double v2 public stati...
浮點數進行計算
public static void main string args 為什麼會出現這種情況?計算機採用二進位制進行計算,有些資料可以用二進位制表示。如0.5 1 2 2 1 但是有些不行,如0.1,這就好像1 3用十進位制無法準確的表示。計算機採用機器語言來表示數值,即二進位制 名稱意義 原碼正數...
定點數和浮點數 定點數和浮點數計算
這個東西其實不是很難,但是確實足夠繞的,因為從十進位制的加減乘除轉換到二進位制的加減乘除就已經很麻煩了,然後為了選拔人才,不給你二進位制,直接給你十六進製制,當然最麻煩的還是補碼和移碼,確實足夠 但是給予足夠的練習還是可以比較熟練的,公式稍後會整理到置頂的公式大全中。可以看完了以後去嘗試一下相關計算...