概述
今天在用到 BigDecimal 做除法时候遇到这样一个错
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result
后面一查,发现是对 BigDecimal 不熟悉,用错方法的缘故。BigDecimal 类型用 divide(BigDecimal divisor) 方法做除法的时候,如果除不尽,就会报上面的这个错。正确的操作应该是用它的重载方法 divide(BigDecimal divisor, int scale, int roundingMode) 。
需注意的是这个方法有三个参数,(第一个是 除数,第二个是结果保留的精度,第三个是舍位模式),
同时它有个两个参数的重载方法divide(BigDecimal divisor,int roundingMode)(第一个是 除数,第二个是舍位模式)。两个参数的方法默认保留精度是0,保留整数。(两个参数的方法不要把第二个参数当成结果保留的精度)。
再说一下舍位模式:(以保留两位举例)
名称 | 对应值 | 解释说明 | 举例 |
---|---|---|---|
ROUND_UP | 0 | 朝远离数轴原点的方向进位 | 3.3333 —> 3.34; 22.1234 —> -22.13; |
ROUND_DOWN | 1 | 朝靠近数轴原点的方向进位 | 3.3333 —> 3.33; -22.1234 —> -22.12; |
ROUND_CEILING | 2 | 按保留位数取大于等于它的最小数 | 3.3333 —> 3.34; -22.1234 —> -22.12; |
ROUND_FLOOR | 3 | 按保留位数四舍五入 负数先取绝对值再四舍五入 | 3.3333 —> 3.33; -22.1234 —> -22.13; |
ROUND_HALF_UP | 4 | 按保留位数四舍五入 负数先取绝对值再四舍五入 | 3.3333 —> 3.33; -22.1234 —> -22.13; 2.345 —> 2.35; |
ROUND_HALF_DOWN | 5 | 按保留位数四舍六入,五看情况,五后非空进 一位,五后为空(或全0)舍去,负数先取绝对值 再按规则保留 | 1.13501 —> 1.14; 1.135 —> 1.13; -2.345 —> -2.34; -2.3456 —> -2.35; |
ROUND_HALF_EVEN | 6 | 这个叫"银行家舍入",按保留位数四舍六入, 五看情况,五后非空进一位,五后为空(或全0) 看(五前面一位的)奇偶,五前为偶应舍去, 五前为奇要进一,负数先取绝对值再按规则保留 | 五后非空: 1.12501 —> 1.13;
五后为空,五前为偶: 1.12500000—> 1.13 |
ROUND_UNNECESSARY | 7 | 断言请求的操作具有精确的结果,因此不需要舍入。 如果对获得精确结果的操作指定此舍入模式,则抛 出 arithmeticexception | 1.1000 —> 1.10; 2.3333... —> 抛出算术异常; |
最后
以上就是幽默小蝴蝶为你收集整理的BigDecimal 除法的全部内容,希望文章能够帮你解决BigDecimal 除法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复