BigDecimal中的ArithmeticException异常之 Non-terminating decimal expansion; no exact representable decimal result.
使用BigDecimal两个数做除法的时候,有时会抛出这样的异常: Non-terminating decimal expansion; no exact representable decimal result。直接从百度翻译出来结果是:非终止十进制扩展,没有可精确表示的十进制结果。此时也就是divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常。
解决方式:设置精确的小数位位数。
例如:
//小数位2位
end.divide(start, 2, BigDecimal.ROUND_UP)
源码,scale是小数位,roundingMode是常量。


|
static int |
ROUND_CEILING Rounding mode to round towards positive infinity. 向正无穷方向舍入 |
|
static int |
ROUND_DOWN Rounding mode to round towards zero. 向零方向舍入 |
|
static int |
ROUND_FLOOR Rounding mode to round towards negative infinity. 向负无穷方向舍入 |
|
static int |
ROUND_HALF_DOWN Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round down. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入,例如1.55保留一位 小数结果为1.5 |
|
static int |
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 |
|
static int |
ROUND_HALF_UP Rounding mode to round towards "nearest neighbor" unless both neighbors are equidistant, in which case round up. 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位 小数结果为1.6 |
|
static int |
ROUND_UNNECESSARY Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary. 计算结果是精确的,不需要舍入模式 |
|
static int |
ROUND_UP Rounding mode to round away from zero. 向远离0的方向舍入 |
本文深入探讨了在Java中使用BigDecimal进行除法运算时遇到的ArithmeticException异常——Non-terminating decimal expansion; no exact representable decimal result。解释了这一异常的原因在于除法结果的无限循环小数特性,并提供了通过设定小数位数和舍入模式来避免异常的解决方案。
4756

被折叠的 条评论
为什么被折叠?



