Java - BigDecimal 的使用

前言

记录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 -
梦想是咸鱼
关注一下吧
posted @ 2021-08-23 16:25  Maggieq8324  阅读(55)  评论(0编辑  收藏  举报