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

很早以前, 記得一次面試, 面試官問存儲金錢用什麼數據類型? 當時只知道8種數據類型(boolean, byte, short, int, long, float, double, char)的我, 回答了double, 由於我以爲double是雙精度類型, 最適合, 可是面試官告訴我應該用BigDecimal! 最近在作支付的項目, 纔對這種數據類型有了更多的瞭解.java

栗子

請看題:mysql

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

示例1面試

問, 結果是多少? 0.01?sql

No! 結果是0.009999999999999998!數據庫

爲何會這樣呢? 由於float和double都是浮點數, 都有取值範圍, 都有精度範圍. 浮點數與一般使用的小數不一樣, 使用中, 每每難以肯定. 常見的問題是定義了一個浮點數, 通過一系列的計算, 它原本應該等於某個肯定值, 但實際上並非! 金額必須是徹底精確的計算, 故不能使用double或者float, 而應該採用java.math.BigDecimal.數據庫設計

加減乘除

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

請看示例:spa

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

示例2設計

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

大小比較

兩個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 '帳戶餘額',

相關文章
相關標籤/搜索