目錄
- 前言
- 具體應用
-
- 構造器
- 加減乘除運算
- 比較大小
- divide方法注意問題
- RoundingMode 小數保留模式
前言
記錄BigDecimal的一些應用,BigDecimal對超過16位有效位的數提供了精确的運算支援。
具體應用
構造器
BigDecimal num1 = new BigDecimal("5"); // String 推薦使用
BigDecimal num2 = new BigDecimal(5); // int
BigDecimal num3 = new BigDecimal(2147483648L); // Long
BigDecimal num4 = new BigDecimal(new Double("12.12")); // Double 不推薦使用,精度丢失
System.out.println(num1); // 5
System.out.println(num2); // 5
System.out.println(num3); // 2147483648
System.out.println(num4); // 12.1199999999999992184029906638897955417633056640625
加減乘除運算
BigDecimal num1 = new BigDecimal("5");
BigDecimal num2 = new BigDecimal("2");
// 加法
System.out.println(num1.add(num2)); // 7
// 減法
System.out.println(num1.subtract(num2)); // 3
// 乘法
System.out.println(num1.multiply(num2)); // 10
// 除法
System.out.println(num1.divide(num2)); // 2.5
比較大小
- BigDimical 的大小比較使用用 compareTo 方法
/**
* 大小比較
* compare = -1,表示num1小于num2;
* compare = 0,表示num1等于num2;
* compare = 1,表示num1大于num2;
*/
int compare = num1.compareTo(num2);
System.out.println(compare); // 1
divide方法注意問題
- BigDecimal 做除法的時候注意出現無限循環
BigDecimal num1 = new BigDecimal("1");
BigDecimal num2 = new BigDecimal("3");
System.out.println(num1.divide(num2)); // 0.333333333333
- 運作異常
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
- 解決方法:指定保留的小數的位數
System.out.println(num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP));
- 文法:divide(BigDecimal,保留小數點後幾位小數,小數保留模式)
RoundingMode 小數保留模式
保留模式 | 說明 |
---|---|
ROUND_CEILING | 向正無窮方向舍入 |
ROUND_FLOOR | 向負無窮方向舍入 |
ROUND_HALF_UP | 四舍五入 |
ROUND_HALF_DOWN | 五舍六入 |
ROUND_HALF_EVEN | 銀行家算法,四舍六入五考慮,五後非空就進一,五後為空看奇偶,五前為偶應舍去,五前為奇要進一 |
ROUND_UNNECESSARY | 無需舍位 |
ROUND_UP | 向遠離零的方向舍入 |
ROUND_DOWN | 向零方向舍入 |
- End - ﹀ ﹀ ﹀ 夢想是鹹魚 關注一下吧