关于 Java BigDecimal 类型调用 divide 做除法运算时报错详解:

本贴最后更新于 1607 天前,其中的信息可能已经时移世改

摘抄后台报错内容:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

报错语句为第三句:

BigDecimal arrivalRate = actualStaff.divide(numberStaff);
原因:

java 中如果用 BigDecimal 做除法的时候一定要在 divide 方法中传递第二个参数,定义精确到小数点后几位,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常。

解决方法:

BigDecimal arrivalRate = actualStaff.divide(numberStaff,2,BigDecimal.ROUND_HALF_UP);

关于调用 divide 方法参数说明:

public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)`
第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式。

知识点:😄

ROUND_CEILING
如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
ROUND_DOWN
从不在舍弃(即截断)的小数之前增加数字。
ROUND_FLOOR
如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
ROUND_HALF_DOWN
若舍弃部分>5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
ROUND_UNNECESSARY
该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
ROUND_UP
总是在非 0 舍弃小数(即截断)之前增加数字。

直接看黑板:

BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2

BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3

BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4

BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3

后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3190 引用 • 8214 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wizardforcel

    你这解释。。。还是看我的吧:

    • ROUND_UP:向正无穷方向对齐(转换为正无穷方向最接近的所需数值)
    • ROUND_DOWN:向负无穷方向对齐
    • ROUND_CEILING:向原点的反方向对齐
    • ROUND_FLOOR:向原点方向对齐
    • ROUND_HALF_UP:“四舍五入”,如果舍弃部分的最高位大于等于 5,向正无穷方向对齐,否则向负无穷方向对齐
    • ROUND_HALF_DOWN:“五舍六入”,如果舍弃部分的最高位大于 5,向正无穷方向对齐,否则向负无穷方向对齐
    • ROUND_HALF_EVEN:“四舍六入五成双”,如果舍弃部分的最高位大于等于六,或等于五并且前一位是奇数,向正无穷方向对齐,否则向负无穷方向对齐
    • ROUND_UNNECESSARY:如果需要舍入,就抛出算术异常
    1 回复
  • 10001
    作者

    哈哈 😄