double型別運算異常

2022-09-07 23:33:30 字數 1139 閱讀 4817

對於兩個double型別的數值運算,有時會出現結果值異常的情況。

看如下**:

public class doubletest 

}

對於以上的四則運算,我們可以很容易的計算出結果39.99, 0.34, 3.3 ,0.123,然而計算機執行結果如下:

j**a中的簡單浮點數型別float和double不能夠進行運算,因為大多數情況下是正常的,但是偶爾會出現如上所示的問題。這個問題其實不是j**a的bug,因為計算機本身是二進位制的,而浮點數實際上只是個近似值,所以從二進位制轉化為十進位制浮點數時,精度容易丟失,導致精度下降。

解決方法:

要保證精度就要使用bigdecimal類,而且不能直接從double直接轉bigdecimal,要將double轉string再轉bigdecimal。也就是不能使用bigdecimal(double val) 方法,你會發現沒有效果。要使用bigdecimal(string val) 方法。

1.相加

public static double add(double a1, double b1)
2.相減

public static double sub(double a1, double b1)
3.相乘

public static double mul(double a1, double b1)
4.相除

public static double div(double a1, double b1, int scale) 

bigdecimal a2 = new bigdecimal(double.tostring(a1));

bigdecimal b2 = new bigdecimal(double.tostring(b1));

return a2.divide(b2, scale, bigdecimal.round_half_up).doublevalue();

}

使用這些方法,我們再次計算一次結果:

奇怪的Double運算

今天測試同學反饋有乙個執行了很久的程式,最近的崩潰率很高,通過日誌查詢發現,這是乙個查詢進度的介面,進度結果的精度是小數點後兩位。但是日誌中卻有很多的超過這個精度的結果,簡化了一下 1 double progress 0.07000000000001d 2 decimalformat df new ...

實現double型別的整數次方的運算

記錄一下,原因是這個方法我沒有想到。首先是特殊情況考慮不全,其次是在在進行計算時,沒有想到這麼巧妙的方法。public class main return exp 0 1.0 0.0 if exp 0 return1 solution base,exp if exp 1 return base do...

C 之Float型別, double型別

c 裡的小數分為float和double兩種型別,這兩種型別,直接看 及執行結果我們來看一下他們有什麼區別 include iostream using namespace std int main 再來看 的執行結果 接下來分析一下 邏輯很簡單,這裡只說一行 cout.setf ios base ...