java中double類型運算結(jié)果異常的解決方法
問題:
對兩個double類型的值進行運算,有時會出現(xiàn)結(jié)果值異常的問題。比如:
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ù)實際上只是個近似值,所以從二進制轉(zhuǎn)化為十進制浮點數(shù)時,精度容易丟失,導(dǎo)致精度下降。
要保證精度就要使用BigDecimal類,而且不能直接從double直接轉(zhuǎn)BigDecimal,要將double轉(zhuǎn)string再轉(zhuǎn)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類型運算結(jié)果異常的解決方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器方法實例
這篇文章主要給大家介紹了關(guān)于如何利用Java簡單實現(xiàn)一個代碼行數(shù)統(tǒng)計器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
關(guān)于JAVA_HOME路徑修改之后JDK的版本依然不更改的解決辦法
今天小編就為大家分享一篇關(guān)于JAVA_HOME路徑修改之后JDK的版本依然不更改的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-04-04
Spring之spring-context-indexer依賴詳解
這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
javax.net.ssl.SSLException: java.lang.RuntimeException: Coul
這篇文章主要介紹了javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解決方法,有需要的朋友們可以學(xué)習(xí)下。2019-08-08

