前言
項目中明確規定,凡是涉及到金額的屬性定義都必須使用BigDecimal類型,這裏來和大家一起學習下BigDecimal的正確打開方式。
先來個錯誤的示範
話不多說,直接上demo
@Test
public void wrongUseDecimal() {
BigDecimal test1 = new BigDecimal(1.745);
BigDecimal test2 = new BigDecimal(0.745);
test1 = test1.setScale(2, BigDecimal.ROUND_HALF_UP);
test2 = test2.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println(test1);
System.out.println(test2);
}
上面是對1.745和0.745四捨五入保留兩位有效數字,輸出結果如下
1.75
0.74
使用參數爲float或double的BigDecimal創建對象會丟失精度。
System.out.println(new BigDecimal(1.745));
// 1.74500000000000010658141036401502788066864013671875
System.out.println(new BigDecimal(0.745));
// 0.74499999999999999555910790149937383830547332763671875
如上面所示,因爲精度丟失,所以在四捨五入的時候沒有達到預期目標。大家不要覺得不就相差0.01麼,影響不大吧,但是如果這兩個數字後面的單位是億呢?因此強烈建議不要使用參數爲float或double的BigDecimal創建對象。
正確使用姿勢
//使用BigDecimal(String val)的構造方法創建對象
new BigDecimal("1.745");
new BigDecimal("0.745");
//使用使用BigDecimal的valueOf(double val)方法創建對象
BigDecimal.valueOf(1.745);
BigDecimal.valueOf(0.745);
拓展DecimalFormat
DecimalFormat
是 NumberFormat
的一個具體子類,用於格式化十進制數字。該類設計有各種功能,使其能夠解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支持。它還支持不同類型的數,包括整數 (123)、定點數 (123.4)、科學記數法表示的數 (1.23E4)、百分數 (12%) 和金額 ($123)。所有這些內容都可以本地化。
符號 | 位置 | 本地化? | 含義 |
---|---|---|---|
0 | 數字 | 是 | 阿拉伯數字 |
# | 數字 | 是 | 阿拉伯數字如果不存在就顯示爲空 |
. | 數字 | 是 | 小數分隔符或貨幣小數分隔符 |
- | 數字 | 是 | 減號 |
, | 數字 | 是 | 分組分隔符 |
E | 數字 | 是 | 分割科學技術法中的尾數和指數。在前綴和後綴中無需添加引號 |
; | 子模式邊界 | 是 | 分隔正數和負數子模式 |
% | 前綴或後綴 | 是 | 乘以100並顯示爲百分數 |
/u2030 | 前綴或後綴 | 是 | 乘以1000並顯示爲千分數 |
¤ (\u00A4) | 前綴或後綴 | 否 | 貨幣記號,由貨幣符號替換。如果兩個同時出現,則用國際貨幣符號替換。如果出現在某個模式中,則使用貨幣小數分隔符,而不使用小數分隔符 |
' | 前綴或後綴 | 否 | 用於在前綴或或後綴中爲特殊字符加引號,例如 "'#'#" 將 123 格式化爲 "#123"。要創建單引號本身,請連續使用兩個單引號:"# o''clock" |
測試Demo如下
double pi = 3.1415927;//圓周率
//取一位整數
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整數和兩位小數
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取兩位整數和三位小數,整數不足部分以0填補。
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整數部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式計數,並取兩位小數
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
小知識,大家也不可忽視呀!