我正在使用 Java 7 64 位开发 LibGDX 程序。
当我使用 junit 测试一个接收浮点数作为参数的函数时,我得到了一个奇怪的结果。我使用123.123456f
作为参数调用函数,函数接收123.12346
. 为什么会这样?
当我12.123456f
用作参数时,它得到了正确的结果。
123.12345f
仍然有效。
因此我System.out.println(...)
用来检查输入。
这对我来说并不重要,但我只想知道为什么。非常感谢你!
问候,安东尼
我正在使用 Java 7 64 位开发 LibGDX 程序。
当我使用 junit 测试一个接收浮点数作为参数的函数时,我得到了一个奇怪的结果。我使用123.123456f
作为参数调用函数,函数接收123.12346
. 为什么会这样?
当我12.123456f
用作参数时,它得到了正确的结果。
123.12345f
仍然有效。
因此我System.out.println(...)
用来检查输入。
这对我来说并不重要,但我只想知道为什么。非常感谢你!
问候,安东尼
f
表示float
单精度IEEE-754浮点数。它们不是很精确,它们只有大约七位有效数字。您可以使用d
for将其翻倍(!) double
,它是一个双精度浮点数,提供大约 15 位精度。当然,前提是无论您将其传递给什么都接受double
s 而不仅仅是float
s。如果它需要任何合理的精度,它应该。
但请注意,即使双打也有问题。它们具有更高的精度,而不是完美的精度。IEEE-754 浮点专为快速计算和紧凑存储而设计。经典的不精确示例,即使使用双打,也是0.1 + 0.2
,结果为0.30000000000000004
。
如果您正在处理货币数字(我认为,使用该库,您不是),您可能会查看BigDecimal
,它的工作方式更像我们习惯于使用任意数量的数字。它们更大,速度更慢,并且有自己的问题(例如它们无法准确表示的事实1 / 3
),但对于货币而言,它们可能是更好的选择。