轉自:https://www.cnblogs.com/heqiyoujing/p/11221497.html
Java面試高頻問題:你會用什么數據類型來存儲金額?
如果這個時候你回答float,double那么恭喜你,又可以省出時間來准備別的公司的面試了,當面試官說float,和double不行的時候你可能還一臉懵逼,為啥不行?那么請看下面的例子:
public class Test {
public static void main(String[] args) {
double a=1;
double b=0.9;
double c=a-b;
System.out.println(c);
}
}
結果要多少,如果你覺得要0.1,那你就錯了。結果居然要0.09999999999999998。因為float與double都是浮點數,浮點數參與的運算通常伴隨着因為無法精確表示而進行的近似或舍入,所以導致結果會有絲毫的偏差,而涉及金額的計算是絕對不予許存在偏差的。
我們可以使用java.math.BigDecimal.來表示金額。
轉自:https://www.cnblogs.com/yadongliang/p/9066188.html
java.math.BigDecimal 音譯:碧哥 戴死貓
01 | 加減乘除
兩個BigDecimal值應該怎樣進行加減乘除呢? +, -, *, / 這樣寫嗎? 不!
請看示例:
示例2
加減乘除使用了英文的加減乘除, 即add, substract, multiply和divide
02 | 大小比較
兩個BigDecimal值怎么比較大小呢? 能用>或者<嗎? 也不可以!
示例3
兩個BigDecimal值比較使用compareTo方法, 比較結果有-1, 0, 1, 分別表示小於, 等於, 大於; 對於0, 可以使用BigDecimal.ZERO表示!
03 | 小數位數及四舍五入規則
在項目中, 涉及到稅費的計算, 計算的結果可能是小數點后面十幾位, 那么怎么進行結算呢? 這就需要四舍五入這種東東了.
示例4
其中setScale的第一個參數是小數位數, 這個示例是保留2位小數, 后面是四舍五入規則.
04 | mysql數據庫設計
BigDecimal在進行入庫時, 數據庫選擇decimal類型, 長度可以自定義, 如18; 小數點我們項目中用的是2, 保留2位小數. 此外還要注意的就是默認值, 一定寫成0.00, 不要用默認的NULL, 否則在進行加減排序等操作時, 會帶來轉換的麻煩!
`balance` decimal(18,2) DEFAULT '0.00' COMMENT '賬戶余額',