java中double類型運(yùn)算結(jié)果異常的解決方法
問題:
對兩個double類型的值進(jìn)行運(yùn)算,有時會出現(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不能夠進(jìn)行運(yùn)算,因為大多數(shù)情況下是正常的,但是偶爾會出現(xiàn)如上所示的問題。這個問題其實不是JAVA的bug,因為計算機(jī)本身是二進(jìn)制的,而浮點數(shù)實際上只是個近似值,所以從二進(jìn)制轉(zhuǎn)化為十進(jì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類型四則運(yùn)算例子:
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類型運(yùn)算結(jié)果異常的解決方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Java中使用BigDecimal進(jìn)行浮點數(shù)運(yùn)算
- java大數(shù)乘法的簡單實現(xiàn) 浮點數(shù)乘法運(yùn)算
- JAVA浮點數(shù)計算精度損失底層原理與解決方案
- Java中浮點數(shù)精度問題的解決方法
- java實現(xiàn)浮點數(shù)轉(zhuǎn)人民幣的小例子
- Java中的浮點數(shù)分析
- Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運(yùn)算(2)
- java實現(xiàn)隨機(jī)輸出300題四則運(yùn)算
- Java中使用BigDecimal進(jìn)行精確運(yùn)算
- 【Java】BigDecimal實現(xiàn)加減乘除運(yùn)算代碼
- Java中精確的浮點運(yùn)算操作示例
相關(guān)文章
java如何將一個float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示
這篇文章主要介紹了java如何將一個float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07詳解Spring MVC的異步模式(高性能的關(guān)鍵)
本篇文章主要介紹了詳解Spring MVC的異步模式(高性能的關(guān)鍵),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用JDBC獲取相關(guān)數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類
Axis是一個基于Java的Web服務(wù)框架,可以用來調(diào)用Web服務(wù)接口,下面這篇文章主要給大家介紹了關(guān)于如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類的相關(guān)資料,需要的朋友可以參考下2023-04-04