奇怪的浮动除法结果

Fab*_*oli 1 java floating-point grails groovy

我发生在grails项目中的这个奇怪的除法错误中(但我认为grails与它没什么关系,我认为是一个常规或java问题):

如果在groovy控制台中我运行它

float money = -1.30
float r = 0.01

println ((money/r).class.name)
println ((money/r).floatValue())
println ((money/r).toString() )
Run Code Online (Sandbox Code Playgroud)

我得到了这个输出

java.lang.Double
-130.0
-129.99999813735482
Run Code Online (Sandbox Code Playgroud)

groovy中的float分区给了我一个Double,这是正确的,但为什么Double toString()给我一个如此奇怪的值"-129.99999813735482"而不是正确的"-130.0"?

Mic*_*rdt 6

浮点指南:

为什么我的数字,如0.1 + 0.2加起来不是很好的一轮0.3,而是我得到一个奇怪的结果,如0.30000000000000004?

因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字.

编译或解释代码时,"0.1"已经四舍五入到该格式中最接近的数字,即使在计算发生之前也会导致小的舍入误差.

具体而言,1.3和0.01都不能用a精确表示float.


tim*_*tes 5

正如每个人所说,对于您想要做的事情来说不够精确doublefloat

一种解决方案是不用作float对象类型,并执行以下操作:

def money = -1.30
def r = 0.01

println ((money/r).class.name)
println ((money/r).floatValue())
println ((money/r).toString() )
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Groovy 使用BigDecimal,这意味着输出是:

java.math.BigDecimal
-130.0
-130
Run Code Online (Sandbox Code Playgroud)