1

我正在使用 Java 7 64 位开发 LibGDX 程序。

当我使用 junit 测试一个接收浮点数作为参数的函数时,我得到了一个奇怪的结果。我使用123.123456f作为参数调用函数,函数接收123.12346. 为什么会这样?

当我12.123456f用作参数时,它得到了正确的结果。 123.12345f仍然有效。

因此我System.out.println(...)用来检查输入。

这对我来说并不重要,但我只想知道为什么。非常感谢你!

问候,安东尼

4

1 回答 1

3

f表示float单精度IEEE-754浮点数。它们不是很精确,它们只有大约七位有效数字。您可以使用dfor将其翻倍(!) double,它是一个双精度浮点数,提供大约 15 位精度。当然,前提是无论您将其传递给什么都接受doubles 而不仅仅是floats。如果它需要任何合理的精度,它应该。

但请注意,即使双打也有问题。它们具有更高的精度,而不是完美的精度。IEEE-754 浮点专为快速计算和紧凑存储而设计。经典的不精确示例,即使使用双打,也是0.1 + 0.2,结果为0.30000000000000004

如果您正在处理货币数字(我认为,使用该库,您不是),您可能会查看BigDecimal,它的工作方式更像我们习惯于使用任意数量的数字。它们更大,速度更慢,并且有自己的问题(例如它们无法准确表示的事实1 / 3),但对于货币而言,它们可能是更好的选择。

于 2014-02-21T15:12:56.100 回答