我是靠谱客的博主 幽默小蝴蝶,最近开发中收集的这篇文章主要介绍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... —> 抛出算术异常;

 

 

最后

以上就是幽默小蝴蝶为你收集整理的BigDecimal 除法的全部内容,希望文章能够帮你解决BigDecimal 除法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部