1. 程式人生 > >java中計算精度問題的解決--BigDecimal類的使用

java中計算精度問題的解決--BigDecimal類的使用

今天在學習的時候,第一次使用到BigDecimal類,特此記之。
很多人在利用java進行計算的時候經常會存在這樣一個問題:

package calculate;
import java.math.BigDecimal;
public class Damo {
    public static void main(String[] args) {
        double a1 = 0.1;
        double b1 = 0.006;
        System.out.println(a1+b1);
}

這段程式的計算結果應該為0.106,但是實際執行出來的結果是0.10600000000000001,這個是因為在計算機內部使用二進位制計數導致的。具體原因可以參考一篇標題為《剖析float型的記憶體儲存和精度丟失問題》的網上文章。
下面具體說明解決辦法:

package calculate;
import java.math.BigDecimal;
public class Damo {
    public static void main(String[] args) {
        BigDecimal a = new BigDecimal("0.1");
        BigDecimal b = new BigDecimal("0.006");
        System.out.println(a.add(b).toString());//加法運算
        System.out.println(a.multiply(b).toString());//乘法運算
System.out.println(a.subtract(b).toString());//減法運算 System.out.println(a.divide(b,10,BigDecimal.ROUND_HALF_UP).toString());//除法運算 } }

在進行除法運算時需要注意divide的三個引數:第一個是除數;第二個是小數點後的位數;第三個是四捨五入的時候上取整(ROUND_HALF_UP)還是下取整(ROUND_HALF_DOWN)。
執行結果如下圖:

執行結果

可以看到效果得到很大改善。當a,b的取值很大時,運算結果也是正常的。如下:

package calculate;
import java.math.BigDecimal; public class Damo { public static void main(String[] args) { BigDecimal a = new BigDecimal("18963156834186344849683418.1891634146834166435864849681863"); BigDecimal b = new BigDecimal("18963156834186344849683418.1891634146834166435864849681862"); System.out.println(a.add(b).toString()); System.out.println(a.multiply(b).toString()); System.out.println(a.subtract(b).toString()); System.out.println(a.divide(b,10,BigDecimal.ROUND_HALF_UP).toString()); } }

大資料執行結果

相關推薦

java計算精度問題的解決--BigDecimal的使用

今天在學習的時候,第一次使用到BigDecimal類,特此記之。 很多人在利用java進行計算的時候經常會存在這樣一個問題: package calculate; import java.math.BigDecimal; public class Damo

JAVA的BigInteger與BigDecimal功能強大

取余 並且 log 加減乘除 value java 構造函數 () eof BigInteger類是java為了處理大數字二專門制作的類,可以處理很大的數字(理論上無限大),並且可以實現大數字的類似於int所有數學運算。對算法題來說,再也不怕出現超出int範圍的運算了! 同

java小數處理,bigDecimal應用

add opened 對象 spl eof 轉換成 () double ply 1、構造一個BigDecimal對象: 1 //創建一個BigDecimal對象,初始化必須使用字符串,因為用數值初始化會得到近似值,不準確 2 BigDec

解決java丟失精度問題

解決java中丟失精度問題       在電商專案中遇到的問題,正常的float、double資料進行運算會出現精度丟失問題,在涉及貨幣計算時會出現嚴重後果。 程式碼: System.out.println(0.0

java四捨五入——double轉BigDecimal精度損失問題

背景      在部落格 噁心的0.5四捨五入問題 一文中看到一個關於 0.5 不能正確的四捨五入的問題。主要說的是 double 轉換到 BigDecimal 後,進行四捨五入得不到正確的結果: public class BigDecimalTest {

java的基本數據型存放位置

兩個 內存地址 及其 java 原因 成員變量 調用 變量名 引用變量 一:在方法中聲明的變量,即該變量是局部變量,每當程序調用方法時,系統都會為該方法建立一個方法棧,其所在方法中聲明的變量就放在方法棧中,當方法結束系統會釋放方法棧,其對應在該方法中聲明的變量隨著棧的銷毀

Java接口和抽象的比較

系列 分享 space 日誌信息 pub 指向 相關 最好的 就會 Java中接口和抽象類的比較-2013年5月寫的讀書筆記摘要 1. 概述 接口(Interface)和抽象類(abstract class)是 Java 語言中支持抽象類的兩種機制,是

java為什麽實體需要實現序列化

color 客戶端訪問 tro 我們 str 操作 bsp div zab 當客戶端訪問某個能開啟會話功能的資源,web服務器就會創建一個HTTPSession對象,每個HTTPSession對象都會占用一定的內存,如果在同一個時間段內訪問的用戶太多,就會消耗大量的服務器

Java計算對象的大小

bject tro 項目依賴 all 返回值 not 檢測 app main 一、計算對象大小的方法 Java中如何計算對象的大小呢,找到了4種方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法; 2.BT

JAVA使用MD5加密工具實現對數據的加密處理

歸納 ssa utf int 控制 nic this com nod 1.MD5工具類 package com.ssm.util; import java.security.MessageDigest; public class MD5Util { //將字

Java的並發工具

down ont not 調用 遺傳 數據庫連接 所有 線程 latch 1、等待多線程完成的CountDownLatch CountDownLatch允許一個或多個線程等待其他線程完成操作。join用於讓當前執行線程等待join線程執行結束。其實

重溫java的String,StringBuffer,StringBuilder

nbsp times 優勢 不變 () 網絡 rgb final 線程不安全 不論什麽一個系統在開發的過程中, 相信都不會缺少對字符串的處理。 在 java 語言中, 用來處理字符串的的類經常使用的有 3 個: String、StringBuffer、St

JAVA分為基本數據型和引用數據型區別

zha ole ble 雙精度 全局變量 直接 布爾類型 周期 裏的 一、基本數據類型: byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0 short:短整型,在內存中占16位,即2個字節,取值範圍-32768~3

Java最常用的集合框架之 HashMap

tor nbsp 兩種 lca 元素 adf boolean 線程 進行 一、HashMap的概述 HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數據結構。 HashMap是基於哈希表的Map接口實現的,此實現

JAVA分為基本數據型及引用數據型(問題:堆和棧的區別,系統根據什麽區分堆棧內存)

復雜 復合 小寫 name 布爾 語言 內存空間 結構 抽象 一、基本數據類型: byte:Java中最小的數據類型,在內存中占8位(bit),即1個字節,取值範圍-128~127,默認值0 short:短整型,在內存中占16位,即2個字節,取值範圍-32768~32717

Java的基本數據型及其封裝

實例化 too shadow color ant 基本類 實用 anti 泛型 Java中的數據類型有兩種,基本數據類型和引用數據類型,引用數據類型的創建是需要去new一個對象,該對象的內存分配在堆區,同時棧區會保存一個指向該對象的引用,但是對於一些簡單數據的創建,

Java什麽是實體和實體的作用

Java實體類實體類是在JAVA軟件開發中廣泛使用的概念。 但是網上少有講清楚到底是什麽的。本期我來講一講什麽是實體類。 首先,直觀的看:實體類就是一個擁有Set和Get方法的類。實體類通常總是和數據庫之類的(所謂持久層數據)聯系在一起。這種聯系是借由框架(如Hibernate)來建立的。其次說定義(比較生澀

java反射:加載的構造方法

lan iat abc private out exc @override 私有 try java中反射:加載類的構造方法 package com.ma.reflection; import java.lang.reflect.Constructor; import j

JAVA接口與抽象

rac 構造 轉換 希望 就是 pub 成員變量 類型 規則 抽象類總結 抽象類的概念:是使用關鍵字abstract修飾的類就是抽象類; 抽象類的產生:當多個不能相互繼承的類具有相同的功能時,就需要將共同的信息向上抽取,放到公共的父類中;如果公共的父類只能描述所有子類都

JAVA簡單的MD5加密(MD5Utils)

com rgs api body md5 mex 可能 title 思路 MD5加密分析: JDK API: 獲取對象的API: 加密的API: 1 package cn.utils; 2 3 import java.security.M