Java:Non-terminating decimal expansion; no exact representable decimal result解决

写计算逻辑时遇到以下代码报错

String pingJunZhi = total_price.divide(new BigDecimal(total_num).setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString();

原因是所得结果是无限(不)循环小数,需要设置舍入和保留精度,这里舍入模式默认选的是 

BigDecimal.ROUND_HALF_UP 四舍五入,但这些操作我的代码里是在得到结果之后进行保留和舍入,实际上BigDecimal在得到结果之后,仍不能表示这个数,这时进行保留会报错

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

 应该在计算的时候,直接写清楚保留位数和舍入模式,用Bigdecimal三个参数的重载方法;

public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode) {}

第一个是除数,第二个是小数位数,第三个是舍入模式;这样可以避免该报错,这样写就可以解决了

String pingJunZhi = total_price.divide(new BigDecimal(total_num), 2, BigDecimal.ROUND_HALF_UP)
					.toPlainString();

同时BigDecimal还有设置精度和保留位数的方法,参数分别是保留位数和舍入模式

 public BigDecimal setScale(int newScale, RoundingMode roundingMode) {}

使用这个方法的前提是,你的数是Bigdecimal能表示的数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值