BigDecimal 除法

今天在用到 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... —> 抛出算术异常;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章