用于需要精确计算的结果;
BigDecimal所创建的是对象
1.常见构造函数
- BigDecimal(int)
- BigDecimal(double)
- BigDecimal(long)
- BigDecimal(String)
注意:参数类型为double的构造方法的结果有一定的不可预知性,所以通常建议优先使用String构造方法。
2.加减乘除方法
- add(BigDecimal) 相加
- subtract(BigDecimal) 相减
- multiply(BigDecimal) 相乘
- divide(BigDecimal) 相除
注意:
除法时可能会出现无限循环小数,此时就会抛出异常:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
要设置精度divide(BigDecimal,2)
3.常见的值转换
- toString() 转换成字符串
- doubleValue() 转换成双精度数
- floatValue() 转换成单精度数
- longValue() 转换成长整数
- intValue() 转换成整数
4.大小比较 compareTo()
int a = bigdemical.compareTo(bigdemical2)
返回结果:
a = -1, 表示bigdemical 小于 bigdemical2;
a = 0, 表示bigdemical 等于 bigdemical2;
a = 1, 表示bigdemical 大于 bigdemical2;
注意:
- 通常作为判断条件时与0进行比较,例如,if(a.compareto(b) < 0){…}
- 与0比较适合使用 bigdemical.compareto(BigDemical.Zero)
5.保留精确度,进行四舍五入 setScale(num,round)
建议,使用字符串格式构造,不会损失精度 BigDecimal num = new BigDecimal(“2.222222”);
1.ROUND_UP = 0
// 进位处理,不管后面数字的大小
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_UP);
2.ROUND_DOWN = 1
// 去掉多余的位数,不管后面数字的大小
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_DOWN);
3.ROUND_CEILING = 2
// 如果是正数,相当于BigDecimal.ROUND_UP;如果是负数,相当于BigDecimal.ROUND_DOWN
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_CEILING);
BigDecimal b = new BigDecimal("-2.222222").setScale(2, BigDecimal.ROUND_CEILING);
4.ROUND_FLOOR = 3
// 如果是正数,相当于BigDecimal.ROUND_DOWN;如果是负数,相当于BigDecimal.ROUND_UP
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_FLOOR);
BigDecimal b = new BigDecimal("-2.222222").setScale(2, BigDecimal.ROUND_FLOOR);
5. ROUND_HALF_UP = 4
// 根据后面的数字四舍五入(大于等于 5进位)
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_UP);
6. ROUND_HALF_DOWN = 5
// 根据后面的数字四舍五入(大于 5进位)
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_DOWN);
7. ROUND_HALF_EVEN = 6
// 如果舍弃部分左边的数字为偶数,则作 ROUND_HALF_DOWN;反之
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_EVEN);
8. ROUND_UNNECESSARY = 7
// Scale位数 必须小于等于 小数位数,否则会抛异常:
BigDecimal b = new BigDecimal("2.222222").setScale(2, BigDecimal.ROUND_HALF_UNNECESSARY);