java中double類型運(yùn)算結(jié)果異常的解決方法
問(wèn)題:
對(duì)兩個(gè)double類型的值進(jìn)行運(yùn)算,有時(shí)會(huì)出現(xiàn)結(jié)果值異常的問(wè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中的簡(jiǎn)單浮點(diǎn)數(shù)類型float和double不能夠進(jìn)行運(yùn)算,因?yàn)榇蠖鄶?shù)情況下是正常的,但是偶爾會(huì)出現(xiàn)如上所示的問(wèn)題。這個(gè)問(wèn)題其實(shí)不是JAVA的bug,因?yàn)橛?jì)算機(jī)本身是二進(jìn)制的,而浮點(diǎn)數(shù)實(shí)際上只是個(gè)近似值,所以從二進(jìn)制轉(zhuǎn)化為十進(jìn)制浮點(diǎn)數(shù)時(shí),精度容易丟失,導(dǎo)致精度下降。
要保證精度就要使用BigDecimal類,而且不能直接從double直接轉(zhuǎn)BigDecimal,要將double轉(zhuǎn)string再轉(zhuǎn)BigDecimal。也就是不能使用BigDecimal(double val) 方法,你會(huì)發(fā)現(xiàn)沒(méi)有效果。要使用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ù)為除不盡時(shí),指定精度。
以上這篇java中double類型運(yùn)算結(jié)果異常的解決方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java中使用BigDecimal進(jìn)行浮點(diǎn)數(shù)運(yùn)算
- java大數(shù)乘法的簡(jiǎn)單實(shí)現(xiàn) 浮點(diǎn)數(shù)乘法運(yùn)算
- JAVA浮點(diǎn)數(shù)計(jì)算精度損失底層原理與解決方案
- Java中浮點(diǎn)數(shù)精度問(wèn)題的解決方法
- java實(shí)現(xiàn)浮點(diǎn)數(shù)轉(zhuǎn)人民幣的小例子
- Java中的浮點(diǎn)數(shù)分析
- Java常用數(shù)字工具類 大數(shù)乘法、加法、減法運(yùn)算(2)
- java實(shí)現(xiàn)隨機(jī)輸出300題四則運(yùn)算
- Java中使用BigDecimal進(jìn)行精確運(yùn)算
- 【Java】BigDecimal實(shí)現(xiàn)加減乘除運(yùn)算代碼
- Java中精確的浮點(diǎn)運(yùn)算操作示例
相關(guān)文章
java如何將一個(gè)float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示
這篇文章主要介紹了java如何將一個(gè)float型數(shù)的整數(shù)部分和小數(shù)分別輸出顯示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07詳解Spring MVC的異步模式(高性能的關(guān)鍵)
本篇文章主要介紹了詳解Spring MVC的異步模式(高性能的關(guān)鍵),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Java 函數(shù)式編程要點(diǎn)總結(jié)
函數(shù)式編程并不是Java新提出的概念,其與指令編程相比,強(qiáng)調(diào)函數(shù)的計(jì)算比指令的計(jì)算更重要;與過(guò)程化編程相比,其中函數(shù)的計(jì)算可以隨時(shí)調(diào)用。Java8新引入函數(shù)式編程方式,大大的提高了編碼效率。本文將對(duì)涉及的對(duì)象等進(jìn)行統(tǒng)一的學(xué)習(xí)及記錄。2021-06-06Spring Boot如何使用JDBC獲取相關(guān)的數(shù)據(jù)詳解
這篇文章主要給大家介紹了關(guān)于Spring Boot如何使用JDBC獲取相關(guān)數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類
Axis是一個(gè)基于Java的Web服務(wù)框架,可以用來(lái)調(diào)用Web服務(wù)接口,下面這篇文章主要給大家介紹了關(guān)于如何使用axis調(diào)用WebService及Java?WebService調(diào)用工具類的相關(guān)資料,需要的朋友可以參考下2023-04-04Java自定義簡(jiǎn)單標(biāo)簽實(shí)例
Java自定義簡(jiǎn)單標(biāo)簽可以方便的在頁(yè)面輸出信息,并且對(duì)于權(quán)限的控制,和對(duì)于Jsp標(biāo)簽和servlet代碼的分離有著很好的作用2013-07-07