Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中,33.6f*100!=3360_Java_Decimal_Floating Accuracy - Fatal编程技术网

在java中,33.6f*100!=3360

在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”。浮点数可能很难正确实现,而且它们(正如您所注意到的)没有无限精度。我能想到的最简单的解决办法就是像 另请参见。这是浮点运算的工作方式。这(通常)不准确。使用==比较时要非常小心(如果你使用过的话)

在Java(Eclipse)中,33.6f*100给出了3359.9998。即使33.6*100给出3360。 我无法用其他值重现此问题(例如32.6f*100给出3260)

你知道是什么原因造成的吗?我如何解决这个问题?
在我的例子中,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");
}