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 | 向零方向舍入 |