目錄總結:
原文:浮點數float和double進行運算處理的時候,是不精確的,很容易出問題;
比如:
// 浮點數是不精確的,一定不要用於比較!
float f = 0.1f;
double d = 1.0 / 10;
system.out.println(f == d); // 結果為false
又比如:
float d1 = 423432423f;
float d2 = d1 + 1;
if (d1 == d2) else
若要進行精確的比較,一般使用:bigdecimal
對於常用的加,減,乘,除,bigdecimal類提供了相應的成員方法。
加法: public bigdecimal add(bigdecimal value);
減法: public bigdecimal subtract(bigdecimal value);
減0.1
乘法: public bigdecimal multiply(bigdecimal value);
除法: public bigdecimal divide(bigdecimal value);
bigdecimal a = new bigdecimal("4.5");
bigdecimal b = new bigdecimal("1.5");
a.add(b);//加減乘除方法會返回乙個新的bigdecimal物件,原來的a不變
資料處理
需要對bigdecimal進行截斷和四捨五入可用setscale方法
bigdecimal a = new bigdecimal("4.5635");
a = a.setscale(3, roundingmode.half_up); //保留3位小數,且四捨五入
(1)商業計算使用bigdecimal。
(2)盡量使用引數型別為string的建構函式。
(3) bigdecimal都是不可變的(immutable)的,在進行每一步運算時,都會產生乙個新的物件,所以在做加減乘除運算時千萬要儲存操作後的值。
(4)我們往往容易忽略jdk底層的一些實現細節,導致出現錯誤,需要多加注意。
E754浮點數運算誤差用Bigdecimal解決
j a.math.bigdecimal double型別 1.0 0.8的結果不是0.2,而是0.19999999999999996 所以常用if abs result 你使用別的程式語言 如 j ascript.python等 也有可能顯示這個結果。簡單來說,j a 包括其他程式語言 遵守e754...
浮點數比較
在數 算當中經常會涉及到判斷兩個數是否相等的情況 對於整數很好處理 a b這樣的乙個語句就可以解決全部的問題 但是對於浮點數是不同的 首先,浮點數在計算機當中的二進位制表達方式就決定了大多數浮點數都是無法精確的表達的 現在的計算機大部分都是數字計算機,不是模擬機,數字機的離散化的資料表示方法自然無法...
浮點數比較
部分 思路來自網路。fxxki整理發布。double變數以帶符號的 ieee 64 位 8 個位元組 雙精度浮點數形式儲存 它可以表示十進位制的15或16位有效數字.負值取值範圍為 1.79769313486231570e 308 到 4.94065645841246544e 324,正值取值範圍為...