BigDecimal
BigDecimal
类是 Java 标准库中的一个类,用于表示任意精度的十进制数。相对于基本数据类型 float
和 double
,BigDecimal
能够提供更高的精度和避免浮点数运算误差。
以下是 BigDecimal
类的一些主要特点和用法:
- 精度控制:
BigDecimal
可以表示精确的十进制数,不会受到浮点数舍入误差的影响。- 具有可调整的精度,可以指定小数点后的位数。
- 构造方法:
BigDecimal(double val)
:将双精度浮点数转换为BigDecimal
。BigDecimal(String val)
:将字符串转换为BigDecimal
。
- 常量:
BigDecimal.ZERO
:表示值为零的BigDecimal
。BigDecimal.ONE
:表示值为一的BigDecimal
。BigDecimal.TEN
:表示值为十的BigDecimal
。
- 基本算术操作:
add(BigDecimal augend)
:加法。subtract(BigDecimal subtrahend)
:减法。multiply(BigDecimal multiplicand)
:乘法。divide(BigDecimal divisor)
:除法。remainder(BigDecimal divisor)
:返回除法的余数。pow(int n)
:返回BigDecimal
的 n 次幂。
- 比较和判断:
compareTo(BigDecimal val)
:比较两个BigDecimal
的大小。equals(Object obj)
:判断两个BigDecimal
是否相等。signum()
:返回BigDecimal
的符号函数。
- 取整和舍入:
setScale(int newScale)
:设置小数点后的位数。round(MathContext mc)
:使用指定的MathContext
对BigDecimal
进行舍入。
- 其他方法:
abs()
:返回BigDecimal
的绝对值。negate()
:返回BigDecimal
的相反数。intValue()
、longValue()
、doubleValue()
:将BigDecimal
转换为对应的基本数据类型。
舍入方法
ROUND_UP
(向上舍入):- 如果数字是正数,则舍入行为同
Math.ceil
。 - 如果数字是负数,则舍入行为同
Math.floor
。 - 例子:
1.5
舍入为2.0
,-1.5
舍入为-1.0
。
- 如果数字是正数,则舍入行为同
ROUND_DOWN
(向下舍入):- 向零的方向舍入,即截去多余的小数部分。
- 例子:
1.5
舍入为1.0
,-1.5
舍入为-1.0
。
ROUND_CEILING
(朝正无穷舍入):- 向正无穷方向舍入,即始终向正数方向舍入。
- 例子:
1.5
舍入为2.0
,-1.5
舍入为-1.0
。
ROUND_FLOOR
(朝负无穷舍入):- 向负无穷方向舍入,即始终向负数方向舍入。
- 例子:
1.5
舍入为1.0
,-1.5
舍入为-2.0
。
ROUND_HALF_UP
(四舍五入):- 如果数字部分大于等于 0.5,则舍入行为同
Math.round
。 - 例子:
1.5
舍入为2.0
,-1.5
舍入为-1.0
。
- 如果数字部分大于等于 0.5,则舍入行为同
ROUND_HALF_DOWN
(五舍六入):- 如果数字部分大于 0.5,则舍入行为同
Math.round
。 - 例子:
1.5
舍入为1.0
,-1.5
舍入为-2.0
。
- 如果数字部分大于 0.5,则舍入行为同
ROUND_HALF_EVEN
(银行家舍入法):- 如果数字部分大于 0.5,则舍入行为同
Math.round
。 - 如果数字部分等于 0.5,则舍入到最接近的偶数。
- 例子:
1.5
舍入为2.0
,-1.5
舍入为-2.0
。
- 如果数字部分大于 0.5,则舍入行为同
ROUND_UNNECESSARY
(不需要舍入):- 如果存在多余的小数部分,则抛出
ArithmeticException
。
- 如果存在多余的小数部分,则抛出
在使用 BigDecimal
进行舍入时,可以通过 setScale
方法指定小数点后的位数,并通过 setRoundingMode
方法设置舍入模式。例如:
BigDecimal value = new BigDecimal("1.234567");
BigDecimal roundedValue = value.setScale(2, RoundingMode.HALF_UP);
这里,setScale(2, RoundingMode.HALF_UP)
表示将 value
舍入到小数点后两位,使用四舍五入的模式。