BigDecimal的正確打開方式

前言

項目中明確規定,凡是涉及到金額的屬性定義都必須使用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%

小知識,大家也不可忽視呀!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章