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的方向舍入 |