BigDecimal與double


前幾天,系統處理double類型的加減法,出現問題。

請看題:

Java中存儲金額用什么數據類型?

示例1

問, 結果是多少? 0.01?

No! 結果是0.009999999999999998!

為什么會這樣呢? 因為float和double都是浮點數, 都有取值范圍, 都有精度范圍. 浮點數與通常使用的小數不同, 使用中, 往往難以確定. 常見的問題是定義了一個浮點數, 經過一系列的計算, 它本來應該等於某個確定值, 但實際上並不是!double相減會轉換成二進制,因double有效位數為 16位這就會出現存儲小數位數不夠的情況,這種情況下就會出現誤差,解決方法就是使用BigDecimal,它的有效長度足夠長可存儲 小數位數因此可代替double來進行加減乘除, 金額必須是完全精確的計算, 故不能使用double或者float, 而應該采用java.math.BigDecimal.

加減乘除

兩個BigDecimal值應該怎樣進行加減乘除呢? +, -, *, / 這樣寫嗎? 不!

請看示例:

Java中存儲金額用什么數據類型?

示例2

加減乘除使用了英文的加減乘除, 即add, substract, multiply和divide

大小比較

兩個BigDecimal值怎么比較大小呢? 能用>或者<嗎? 也不可以!

Java中存儲金額用什么數據類型?

示例3

兩個BigDecimal值比較使用compareTo方法, 比較結果有-1, 0, 1, 分別表示小於, 等於, 大於; 對於0, 可以使用BigDecimal.ZERO表示!

小數位數及四舍五入規則

在項目中, 涉及到稅費的計算, 計算的結果可能是小數點后面十幾位, 那么怎么進行結算呢? 這就需要四舍五入這種東東了.

Java中存儲金額用什么數據類型?

示例4

其中setScale的第一個參數是小數位數, 這個示例是保留2位小數, 后面是四舍五入規則.

mysql數據庫設計

BigDecimal在進行入庫時, 數據庫選擇decimal類型, 長度可以自定義, 如18; 小數點我們項目中用的是2, 保留2位小數. 此外還要注意的就是默認值, 一定寫成0.00, 不要用默認的NULL, 否則在進行加減排序等操作時, 會帶來轉換的麻煩!

`balance` decimal(18,2) DEFAULT '0.00' COMMENT '賬戶余額',

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM