天天看點

Java - BigDecimal 的使用前言具體應用

目錄

  • 前言
  • 具體應用
    • 構造器
    • 加減乘除運算
    • 比較大小
    • 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 - ﹀ ﹀ ﹀ 夢想是鹹魚 關注一下吧

Java - BigDecimal 的使用前言具體應用