在给定下列代码行的情况下
BigDecimal step = 10.0G**-1.0G
groovy 1.7.5 返回了错误的结果
0.1000000000000000055511151231257827021181583404541015625
并且 groovy 1.8 返回正确的结果。
0.1
很遗憾,我想解决我的Grails问题。使用groovy 1.8的1.4版本不够稳定(控制器在dev模式下不会刷新),而grails 1.3.7带有groovy 1.7.x。
两个问题:
1.7.5版本是我的问题还是一个bug?
如何避免这种行为?我认为BigDecimal非常适合这种舍入问题。
第二次更新:
现在我有点困惑了。每次尝试似乎都会得到不同的结果...
BigDecimal step = 10.0G**-1.0G
println step
返回 0.1000000000000000055511151231257827021181583404541015625
和
println 10.0G**-1.0G
返回值
0.1
在两个Groovy版本中都存在这个问题。但如果您只是在groovyConsole中输入
BigDec step = 10.0G**-1.0G
,并让控制台打印最后一个响应,则不同的Groovy版本会得到不同的结果。因此,一个问题似乎是groovyConsole。另一个问题似乎是执行的toString转换。
而且似乎涉及到一些自动装箱... 当我执行一个
def step = 10.0G**-1.0G
结果是一个双精度...
我猜这个问题可以归结为两个问题:
- a)哪些数学运算是BigDecimal运算?
和
- b)如何轻松地将BigDecimal四舍五入,以便纠正上述问题?
谢谢您的耐心。