一、基礎概念
BigDecimal是Java中用於表示任意精度的十進制數的類,它允許我們精確地進行任何需要貨幣、財務、科學精度的計算。它提供了各種精確的算術、舍入和格式化操作,比如說我們可以設置小數精度、舍入方式,以及輸出格式。
使用BigDecimal時需要注意以下幾點:
1、BigDecimal值可以通過BigDecimal(String val)進行初始化,也可以通過BigDecimal(double val)進行初始化,但是推薦使用String進行初始化,防止丟失精度。
2、比較BigDecimal值是否相等需要使用compareTo()方法進行比較,因為使用等號進行比較可能會出現結果錯誤的情況。
3、如果要進行加減乘除等運算需要使用BigDecimal的相應方法進行處理,因為這些運算不能像普通數值類型那樣直接運算。
二、格式化操作
BigDecimal類提供了format方法,可以將BigDecimal對象格式化為字符串,方便數據的輸出和展示。format方法中,我們可以設置輸出字符串的格式,包括小數位數、小數位舍入方式、組分隔符等。
1、設置小數位數
在BigDecimal對象上使用setScale方法可以設置小數位數。setScale方法有兩個參數,第一個是保留的小數位數,第二個是保留方式,可以選擇舍入方式,如ROUND_HALF_UP表示四捨五入。
BigDecimal value = new BigDecimal("12.3456789"); BigDecimal result = value.setScale(2, RoundingMode.HALF_UP); System.out.println(result); // 12.35
2、使用組分隔符
在format方法中使用NumberFormat類,可以方便地實現千分位分隔符的效果。使用NumberFormat.setGroupingUsed方法可以啟用或禁用分組,使用NumberFormat.setGroupingSize方法可以設置每個分組的位數。
BigDecimal value = new BigDecimal("1234567890.12345"); NumberFormat numberFormat = NumberFormat.getNumberInstance(); numberFormat.setGroupingUsed(true); numberFormat.setGroupingSize(3); String result = numberFormat.format(value); System.out.println(result); // 1,234,567,890.12345
3、格式化為貨幣數值
使用NumberFormat.getCurrencyInstance方法可以方便地將BigDecimal對象格式化為貨幣數值。
BigDecimal value = new BigDecimal("1234567.89"); NumberFormat numberFormat = NumberFormat.getCurrencyInstance(Locale.US); String result = numberFormat.format(value); System.out.println(result); // $1,234,567.89
三、舍入操作
在進行數值計算時,精度控制十分重要。BigDecimal提供了多種舍入方式,可以根據不同需求選擇不同的舍入方式。
1、ROUND_CEILING
向正無窮方向舍入,即如果BigDecimal是正數,則舍入結果則大於輸入值;如果是負數,則舍入結果小於輸入值。例如1.234使用ROUND_CEILING舍入精度為1,則結果為1.3。
BigDecimal value = new BigDecimal("1.234"); BigDecimal result = value.setScale(1, RoundingMode.CEILING); System.out.println(result); // 1.3
2、ROUND_DOWN
向零方向舍入,即捨去多餘的小數。例如1.234使用ROUND_DOWN舍入精度為1,則結果為1.2。
BigDecimal value = new BigDecimal("1.234"); BigDecimal result = value.setScale(1, RoundingMode.DOWN); System.out.println(result); // 1.2
3、ROUND_FLOOR
向負無窮方向舍入,即如果BigDecimal是正數,則舍入結果則小於輸入值;如果是負數,則舍入結果大於輸入值。例如-1.234使用ROUND_FLOOR舍入精度為1,則結果為-1.3。
BigDecimal value = new BigDecimal("-1.234"); BigDecimal result = value.setScale(1, RoundingMode.FLOOR); System.out.println(result); // -1.3
4、ROUND_HALF_DOWN
向最接近的數字舍入,如果兩個相鄰的數字對於舍入精度的高低一半,則舍入到最鄰近的數字,如果相等,則舍入到相鄰的偶數。例如2.125使用ROUND_HALF_DOWN舍入精度為2,則結果為2.12。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_DOWN); System.out.println(result); // 2.12
5、ROUND_HALF_EVEN
向最接近的數字舍入,如果兩個相鄰的數字對於舍入精度的高低一半,則舍入到最鄰近的數字,如果相等,則舍入到偶數。例如2.125使用ROUND_HALF_EVEN舍入精度為2,則結果為2.12。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_EVEN); System.out.println(result); // 2.12
6、ROUND_HALF_UP
向最接近的數字舍入,如果兩個相鄰的數字對於舍入精度的高低一半,則舍入到最鄰近的數字,如果相等,則舍入到最近的數字,比ROUND_HALF_DOWN多舍入了一個5.例如2.125使用ROUND_HALF_UP舍入精度為2,則結果為2.13。
BigDecimal value = new BigDecimal("2.125"); BigDecimal result = value.setScale(2, RoundingMode.HALF_UP); System.out.println(result); // 2.13
7、ROUND_UNNECESSARY
不進行舍入,如果舍入結果存在非零小數,則拋出ArithmeticException異常。例如1.23使用ROUND_UNNECESSARY舍入精度為1,則拋出異常。
BigDecimal value = new BigDecimal("1.23"); try { BigDecimal result = value.setScale(1, RoundingMode.UNNECESSARY); System.out.println(result); } catch (ArithmeticException e) { System.out.println("精度不合法,無法舍入"); }
四、其他常用操作
1、比較大小
使用compareTo方法進行大小比較,如果相等返回0,小於返回-1,大於返回1。
BigDecimal value1 = new BigDecimal("1.23"); BigDecimal value2 = new BigDecimal("1.24"); int result = value1.compareTo(value2); System.out.println(result); // -1
2、最大最小值
使用max和min方法可以返回兩個BigDecimal對象中較大或較小的那個對象。
BigDecimal value1 = new BigDecimal("1.23"); BigDecimal value2 = new BigDecimal("1.24"); BigDecimal max = value1.max(value2); BigDecimal min = value1.min(value2); System.out.println(max); // 1.24 System.out.println(min); // 1.23
3、取反數
使用negate方法可以返回BigDecimal對象的相反數。
BigDecimal value = new BigDecimal("1.23"); BigDecimal result = value.negate(); System.out.println(result); // -1.23
4、冪運算
使用pow方法可以返回BigDecimal對象的冪運算結果。
BigDecimal value = new BigDecimal("2"); BigDecimal result = value.pow(3); System.out.println(result); // 8
5、加減乘除運算
使用add、subtract、multiply、divide方法可以進行BigDecimal對象的加減乘除運算。
BigDecimal value1 = new BigDecimal("2"); BigDecimal value2 = new BigDecimal("3"); BigDecimal result1 = value1.add(value2); BigDecimal result2 = value1.subtract(value2); BigDecimal result3 = value1.multiply(value2); BigDecimal result4 = value1.divide(value2, 2, RoundingMode.HALF_UP); System.out.println(result1); // 5 System.out.println(result2); // -1 System.out.println(result3); // 6 System.out.println(result4); // 0.67
總結
BigDecimal類是Java中用於表示任意精度的十進制數的類,它可以讓我們精確地進行任何需要貨幣、財務、科學精度的計算。在開發過程中,我們需要注意BigDecimal的初始化方式、比較方法、運算方式以及格式化方式等,以便使用BigDecimal進行更加精準和安全的數值計算。
原創文章,作者:IEAJH,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/332870.html