在java中,33.6f*100!=3360
在Java(Eclipse)中,33.6f*100给出了3359.9998。即使33.6*100给出3360。 我无法用其他值重现此问题(例如32.6f*100给出3260) 你知道是什么原因造成的吗?我如何解决这个问题?在java中,33.6f*100!=3360,java,decimal,floating-accuracy,Java,Decimal,Floating Accuracy,在Java(Eclipse)中,33.6f*100给出了3359.9998。即使33.6*100给出3360。 我无法用其他值重现此问题(例如32.6f*100给出3260) 你知道是什么原因造成的吗?我如何解决这个问题? 在我的例子中,33.6f是由Math.abs函数给出的,因此我不能只删除“f”。浮点数可能很难正确实现,而且它们(正如您所注意到的)没有无限精度。我能想到的最简单的解决办法就是像 另请参见。这是浮点运算的工作方式。这(通常)不准确。使用==比较时要非常小心(如果你使用过的话)
在我的例子中,33.6f是由Math.abs函数给出的,因此我不能只删除“f”。浮点数可能很难正确实现,而且它们(正如您所注意到的)没有无限精度。我能想到的最简单的解决办法就是像
另请参见。这是浮点运算的工作方式。这(通常)不准确。使用
==
比较时要非常小心(如果你使用过的话)。可能重复的不知道你最后一句话的意思:Math.abs的版本太多了,包括一个需要双精度的,那么为什么你不能删除f
?(我并不建议将其作为解决方案。double
在数字足够大时也有同样的问题。)您应该使用bigdecimic
。舍入可能并不总是理想的。例如,在这种情况下,3359.5将“等于”3360。据我所见,使用ε更有效。对于非无限精度,我同意,但在这里,它似乎是一个非常糟糕的精度。我的目的是删除浮点数的小数,直到第三位。所以我做了:(float)(Math.floor(Math.abs(value)*100)/100)
。如果我在Math.abs(balance)*100周围加上一个圆,可能就可以了。但很抱歉,我不是计算机科学家,这似乎是一个太难阅读的文档,无法解决我的小问题。float
提供大约6位小数精度。因此,如果你想要一个小数点左边有4位数字的值,你只能在右边有2位,并且期望得到正确显示的答案。如果你想要左边4,右边4,那就是8。因此,您不能使用float
。
float f = 33.6f;
f *= 100;
if (Math.round(f) == 3360) {
System.out.println("Like so");
}