解决:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal
·
1、出现报错:
2、查询到日志如下:
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1690) ~[?:1.8.0_112]
at com.tyche.spd.utils.SpdUtils.getPackageNumbersFormat(SpdUtils.java:356) ~[classes/:?]
3、找到代码:
BigDecimal number2 = new BigDecimal(commPackageList.get(0).getPackageConversionCoefficient()).divide(new BigDecimal(commPackageList.get(1).getPackageConversionCoefficient()));
4、分析原因:
原因是BigDecimal除法小数无限循环导致的。我们可以向下取整或者向上取整。只要达到不无限循环就可以了。
5、修改代码:
BigDecimal number2 = new BigDecimal(commPackageList.get(0).getPackageConversionCoefficient()).divide(new BigDecimal(commPackageList.get(1).getPackageConversionCoefficient()), 0, BigDecimal.ROUND_HALF_UP);
到这里就解决问题了。
over!!!!
更多推荐
所有评论(3)
您需要登录才能发言
相关推荐
查看更多
A2A

谷歌开源首个标准智能体交互协议Agent2Agent Protocol(A2A)
adk-python

一款开源、代码优先的Python工具包,用于构建、评估和部署灵活可控的复杂 AI agents
Second-Me

开源 AI 身份系统,通过本地训练和部署,模仿用户思维和学习风格,创建专属AI替身,保护隐私安全。
那么,加 99,再减 100,当然就是 “-1” 了。
计算机,使用的是二进制数。
八位二进制数是:0000 0000 ~ 1111 1111。
相当于十进制数:0 ~ 255。
如果,进位 = 1,就是:2^8 = 256。
那么,加 255,再减 256,这也就是 “-1” 了。
所以:255 (1111 1111),就是:-1;
同理:254 (1111 1110),就是:-2;
253 (1111 1101),就是:-3;
。。。 。。。
128 (1000 0000),即:-128。
以上这些正数,就是计算机专家 “发明” 的补码了。
由此可知:
所谓的 “补码”,也是正常的数字。
它之所以能代替负数,关键是【舍弃了进位】。
而并非是来自“符号位原码反码”。
解释或说明“补码”,只需做一道小学算术题。
但是,老外却弄不懂这些。
所以才编造一套谎言:机器数符号位模符号位也参加运算 ...
你看过【卖拐】吗?
你要是跟着老外学算术,你立刻、马上、直接就掉沟里去了!
呵呵
任意的进制中,都有“补码”。
你看十进制,两位数,就是:0 ~ 99。
可以有:27 + 99 = (一百) 26
也可以:27 - 1 = 26
如果你忽略进位,依旧保持两位数,
这两种算法的功能,就是相同的!
就是说,当你舍弃了进位:
正数,就能当负数使用!
加法,也就可以实现减法运算!
如果在计算机中舍弃进位:
减法器,就可以省掉了。
只用一个加法器,就可横行天下!
也可以说,计算机中,根本就没有:原码反码补码。
你费这么多语言来解释补码,只能说:你被忽悠瘸了。