BigDecimal類

目錄

前言

API

構造器:

函數:

BigDecimal精度也丟失

正確運用BigDecimal


前言

       我們都知道浮點型變量在進行計算的時候會出現丟失精度的問題。如下一段代碼:

輸出:

       可以看到在Java中進行浮點數運算的時候,會出現丟失精度的問題。那麼我們如果在進行商品價格計算的時候,就會出現問題。很有可能造成我們手中有0.06元,卻無法購買一個0.05元和一個0.01元的商品。

       因爲如上所示,他們兩個的總和爲0.060000000000000005。這無疑是一個很嚴重的問題,尤其是當電商網站的併發量上去的時候,出現的問題將是巨大的。可能會導致無法下單,或者對賬出現問題。所以接下來我們就可以使用Java中的BigDecimal類來解決這類問題。

普及一下:

API

構造器:

函數:

由於一般的數值類型,例如double不能準確的表示16位以上的數字。

BigDecimal精度也丟失

       我們在使用BigDecimal時,使用它的BigDecimal(String)構造器創建對象纔有意義。其他的如BigDecimal b = new BigDecimal(1)這種,還是會發生精度丟失的問題。如下代碼:

輸出:

       可見論丟失精度BigDecimal顯的更爲過分。但是使用BigdecimalBigDecimal(String)構造器的變量在進行運算的時候卻沒有出現這種問題。究其原因計算機組成原理裏面都有,它們的編碼決定了這樣的結果。

       long可以準確存儲19位數字,而double只能準備存儲16位數字。double由於有exp位,可以存16位以上的數字,但是需要以低位的不精確作爲代價。如果需要高於19位數字的精確存儲,則必須用BigInteger來保存,當然會犧牲一些性能。

       所以我們一般使用BigDecimal來解決商業運算上丟失精度的問題的時候,聲明BigDecimal對象的時候一定要使用它構造參數爲String的類型的構造器

       同時這個原則Effective Java和MySQL 必知必會中也都有提及。floatdouble只能用來做科學計算和工程計算。商業運算中我們要使用BigDecimal

       而且我們從源碼的註釋中官方也給出了說明,如下是BigDecimal類的double類型參數的構造器上的一部分註釋說明:

  1. 第一段也說的很清楚它只能計算的無限接近這個數,但是無法精確到這個數。
  2. 第二段則說,如果要想準確計算這個值,那麼需要把double類型的參數轉化爲String類型的。並且使用BigDecimal(String)這個構造方法進行構造。去獲取結果。

正確運用BigDecimal

       另外,BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符,直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象,由剛纔我們所羅列的API也可看出。

       在一般開發過程中,我們數據庫中存儲的數據都是floatdouble類型的。在進行拿來拿去運算的時候還需要不斷的轉化,這樣十分的不方便。如下示例工具類:

該工具類提供了double類型的基本的加減乘除運算。直接調用即可。

發佈了75 篇原創文章 · 獲贊 80 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章