1 BigDecimal 的定义
- BigDecimal的 4 种构造方法
// 创建一个参数所指定整数值的对象
// public BigDecimal(int val)
BigDecimal num = new BigDecimal(13);
// 创建一个参数所指定双精度值的对象(不建议采用)
// public BigDecimal(double val)
BigDecimal num2 = new BigDecimal(5.34);
// 创建一个参数所指定长整数值的对象
// public BigDecimal(long val)
BigDecimal num3 = new BigDecimal(4L);
// 创建一个参数所指定以字符串表示的数值的对象
// public BigDecimal(String val)
BigDecimal num4 = new BigDecimal("5.34");
2 各种数据类型与 BigDecimal 的相互转换
2.1 int 与 BigDecimal 的相互转换
// int 转 BigDecimal
int val = 12;
BigDecimal bdNum = new BigDecimal(val);
// BigDecimal 转 int
BigDecimal bdNum2 = new BigDecimal(12);
int val2 = bdNum2.intValue();
2.2 long 和 BigDecimal 的相互转换
// long 转 BigDecimal
long val3 = 12L;
BigDecimal bdNum3 = new BigDecimal(val3);
// BigDecimal 转 long
BigDecimal bdNum4 = new BigDecimal(12);
long val4 = bdNum4.longValue();
2.3 double 和 BigDecimal 的相互转换
2.3.1 double 转 BigDecimal
// 第一种方法:public BigDecimal(double val)
// 不推荐,存在精度问题
double val5 = 12.23;
BigDecimal bdNum5 = new BigDecimal(val5);
System.out.println(bdNum5); // 12.230000000000000426325641456060111522674560546875
// 第二种方法:public static BigDecimal valueOf(double val)
double val6 = 12.23;
BigDecimal bdNum6 = BigDecimal.valueOf(val6);
System.out.println(bdNum6); // 12.23
// 第三种方法:Double.toString(double d)
double val7 = 12.23;
BigDecimal bdNum7 = new BigDecimal(Double.toString(val7));
System.out.println(bdNum7); // 12.23
2.3.2 BigDecimal 转 double
BigDecimal bdNum8 = new BigDecimal("12.23");
double val8 = bdNum8.doubleValue();
System.out.println(val8); // 12.23
2.4 float 和 BigDecimal 的相互转换
2.4.1 float 转 BigDecimal
// 第一种方法:Float.toString(float f)
float val9 = 12.23f;
BigDecimal bdNum9 = new BigDecimal(Float.toString(val9));
System.out.println(bdNum9); // 12.23
// 第二种方法:public static BigDecimal valueOf(double val)
// 不推荐,会损失精度
float val10 = 12.23f;
BigDecimal bdNum10 = BigDecimal.valueOf(val10);
System.out.println(bdNum10); // 12.229999542236328
2.4.2 BigDecimal 转 float
BigDecimal bdNum11 = new BigDecimal("12.23");
float val11 = bdNum11.floatValue();
System.out.println(val11); // 12.23
3 加减乘除
// 加法
// public BigDecimal add(BigDecimal augend)
BigDecimal result = num.add(num2);
// 减法
// public BigDecimal subtract(BigDecimal subtrahend)
BigDecimal result = num.subtract(num2);
// 乘法
// public BigDecimal multiply(BigDecimal multiplicand)
BigDecimal result = num.multiply(num2);
// 除法
// public BigDecimal divide(BigDecimal divisor)
BigDecimal result = num.divide(num2);
4 设置精度及取整(保留0位小数)
// 设置精度的方法
// scale 是保留小数位数; roundingMode 为小数模式
// 除法 - 对计算结果设置精度
// public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
BigDecimal result = num.divide(num2, 1, BigDecimal.ROUND_HALF_UP);
// 对一个 BigDecimal 对象设置精度
// public BigDecimal setScale(int newScale, int roundingMode)
BigDecimal result = num.setScale(1, BigDecimal.ROUND_HALF_UP);
- 假设 scale 为 n,则 roundingMode 的取值为
roundingMode | 说明 |
---|---|
BigDecimal.ROUND_UP | 保留n位小数,第(n+1)位数字大于0则进1 |
BigDecimal.ROUND_DOWN | 保留n位小数,后面的小数位直接舍弃 |
BigDecimal.ROUND_CEILING | 如果 BigDecimal 是正数则做 ROUND_UP 操作;负数则做 ROUND_DOWN 操作(取附近较大的数) |
BigDecimal.ROUND_FLOOR | 如果 BigDecimal 是正数则做 ROUND_DOWN 操作;负数则做 ROUND_UP 操作(取附近较小的数) |
BigDecimal.ROUND_HALF_UP | 四舍五入 |
BigDecimal.ROUND_HALF_DOWN | 同 ROUND_HALF_UP,区别仅在于第(n+1)位数字等于5且后面小数位全为0时会舍而不是入 |
BigDecimal.ROUND_HALF_EVEN | 四舍六入,五看前一位是偶数就舍,奇数就入 |
BigDecimal.ROUND_UNNECESSARY | 不保留n位小数,如果第(n+1)位起存在小数位且不为0就抛异常:java.lang.ArithmeticException |
5 比较大小
BigDecimal 的 compareTo() 方法进行的是值比较,返回值为 -1,0,1:
num1 < num2,返回 -1
num1 = num2,返回 0
num1 > num2,返回 1
// public int compareTo(BigDecimal val)
// BigDecimal 的 equals 方法当精度不一样的时候也当做不相等,而 compareTo 方法忽略精度的不同,只比较数值是否相同
BigDecimal num3 = new BigDecimal("3.30");
BigDecimal num4 = new BigDecimal("3.3");
BigDecimal num5 = new BigDecimal("3.5");
System.out.println(num3.compareTo(num4)); // 0
System.out.println(num3.equals(num4)); // false
System.out.println(num3.compareTo(num5)); // -1
6 取余
// public BigDecimal[] divideAndRemainder(BigDecimal divisor)
// 该方法的参数即为除数,返回一个 BigDecimal 数组,返回数组中包含两个元素,第一个元素为两数相除的商,第二个元素为余数
BigDecimal num6 = new BigDecimal(11);
BigDecimal num7 = new BigDecimal(3);
BigDecimal[] results = num6.divideAndRemainder(num7);
System.out.println(results[0]); // 3
System.out.println(results[1]); // 2