一个人至少拥有一个梦想,有一个理由去坚强

心若没有栖息的地方,到哪里都是在流浪

java.lang.ArithmeticException: 异常的解决方法

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

最近开发过程中,遇到的问题。在本地测试明明一切正常,到测试环境就报错。查日志后,原来是BigDecimal做除法的时候没有保留小数位,数据除不尽,导致报错。也怪自己经验不足。在此记录下来,望后面不再犯。

报错示例:

new BigDecimal("10").divide(new BigDecimal("3"));

JAVA中如果用BigDecimal做除法的时候一定要在divide方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。

解决方法:在divide时候,传递保留精度位数的参数,以及保留精度模式的参数。

new BigDecimal("10").divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
参数说明

divide方法有两个重载的方法,一个是传两个参数的,一个是传三个参数的:

两个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数

@param roundingMode rounding mode to apply. 传入round的模式

三个参数的方法:

@param divisor value by which this {@code BigDecimal} is to be divided. 传入除数
@param scale scale of the {@code BigDecimal} quotient to be returned. 传入精度
@param roundingMode rounding mode to apply. 传入round的模式

BigDecimal round模式

参数定义

ROUND_CEILING
Rounding mode to round towards positive infinity.
向正无穷方向舍入

ROUND_DOWN
Rounding mode to round towards zero.
向零方向舍入

ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负无穷方向舍入

ROUND_HALF_DOWN

Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round down.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN
Rounding mode to round towards the “nearest neighbor” unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round up.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍入模式

ROUND_UP
Rounding mode to round away from zero.
向远离0的方向舍入

补充:BigDecimal 保留两位小数

《java.lang.ArithmeticException: 异常的解决方法》

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注