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... —> 抛出算术异常;

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值