java中double類型運算結果異常的解決方法
問題:
對兩個double類型的值進行運算,有時會出現(xiàn)結果值異常的問題。比如:
System.out.println(19.99+20); System.out.println(1.0-0.66); System.out.println(0.033*100); System.out.println(12.3/100);
輸出:
39.989999999999995
0.33999999999999997
3.3000000000000003
0.12300000000000001
解決方法:
Java中的簡單浮點數(shù)類型float和double不能夠進行運算,因為大多數(shù)情況下是正常的,但是偶爾會出現(xiàn)如上所示的問題。這個問題其實不是JAVA的bug,因為計算機本身是二進制的,而浮點數(shù)實際上只是個近似值,所以從二進制轉化為十進制浮點數(shù)時,精度容易丟失,導致精度下降。
要保證精度就要使用BigDecimal類,而且不能直接從double直接轉BigDecimal,要將double轉string再轉BigDecimal。也就是不能使用BigDecimal(double val) 方法,你會發(fā)現(xiàn)沒有效果。要使用BigDecimal(String val) 方法。具體例子如下所示。
double類型四則運算例子:
1、相加
public static double add(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.add(b2).doubleValue();
}
2、相減
public static double sub(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.subtract(b2).doubleValue();
}
3、相乘
public static double mul(double a1, double b1) {
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.multiply(b2).doubleValue();
}
4、相除
public static double div(double a1, double b1, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("error");
}
BigDecimal a2 = new BigDecimal(Double.toString(a1));
BigDecimal b2 = new BigDecimal(Double.toString(b1));
return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
scale參數(shù)為除不盡時,指定精度。
以上這篇java中double類型運算結果異常的解決方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java如何將一個float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示
這篇文章主要介紹了java如何將一個float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
Spring Boot如何使用JDBC獲取相關的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關于Spring Boot如何使用JDBC獲取相關數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-03-03
如何使用axis調用WebService及Java?WebService調用工具類
Axis是一個基于Java的Web服務框架,可以用來調用Web服務接口,下面這篇文章主要給大家介紹了關于如何使用axis調用WebService及Java?WebService調用工具類的相關資料,需要的朋友可以參考下2023-04-04

