【发布时间】:2010-12-26 15:14:05
【问题描述】:
这是指this question中的cmets:
Java 中的这段代码生成 12.100000000000001,这是使用 64 位双精度数,可以精确地呈现 12.1。 – 热解
这是真的吗?我觉得由于浮点数表示为 2 的幂的和,所以无论你有多少位,你都不能准确地表示 12.1。但是,当我实现了这两种算法并打印了使用 (12.1, 3) 和许多有效数字调用它们的结果时,我分别得到了他和我的结果:
12.100000000000000000000000000000000000000000000000000000000000000000000000000 12.10000000000000100000000000000000000000000000000000000000000000000000000000
我使用String.format("%76f") 打印了这个。我知道这比必要的零多,但我在 12.1 中看不到任何舍入。
【问题讨论】:
-
能否请您发布打印这两个数字的代码,因为我不得不说我相信其他 cmet 说您不能准确表示 12.1,以及您要打印的位数应该在某个时候显示刚好超过或低于。如果双精度数有 53 位尾数,那么您可能会看到与第 14 位有效数字之间的差异。
-
这是该问题的前两个答案 - 我不想在这里重复自己。
-
如果你们都使用
strictfp并再次比较结果会怎样?在这种情况下,结果应该与 VM 无关。 (我没有声称没有strictfp语言规范允许不同的结果。不知道不关心。无论如何,浮点数意味着不精确的值) -
我认为您的问题当前设置方式的正确答案在这里 stackoverflow.com/questions/1904321/… 。你的意思是你能在 java
double中准确地表示 12.1 吗? -
我看了那个问题,没有看到任何打印数字的代码,只是计算数字的代码。
标签: java math floating-point numbers floating-accuracy