当前位置: 首页 > 面试题库 >

Java上的奇怪循环0.1到2

符正信
2023-03-14
问题内容

我尝试从0.1循环到2.0,然后将输出打印到控制台。但是我得到了如下奇怪的输出:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2
1.3
1.4000000000000001
1.5000000000000002
1.6000000000000003
1.7000000000000004
1.8000000000000005
1.9000000000000006
2.0000000000000004

源代码:

public class test {
    public static void main(String[] a) {
        double i = 0.1;
        while (i < 2.1)
            System.out.println(i);
            i+=0.1;
        }
    }
}

为什么它不打印确切的数字而不是像点0.79999999999呢?另外,使用for代替还有什么区别while,因为我不知道如何增加0.1?


问题答案:

这是正常的。它是浮点型固有的;像0.3这样的数字不能作为精确值存储在二进制文件中,因此您会逐渐积累错误。参考资料:
Python手册,Wikipedia,Princeton
CS的技术说明



 类似资料:
  • 问题内容: 在分析这里最近一个问题的结果时,我遇到了一个非常奇怪的现象:显然HotSpot的JIT优化的额外一层实际上减慢了我的计算机的执行速度。 这是我用于测量的代码: 该代码非常微妙,所以让我指出一些重要的方面: “普通索引”变体使用直接变量作为数组索引。HotSpot可以轻松确定整个循环的范围并消除数组边界检查; by的“ masked index”变体索引实际上等于,但是通过AND-mas

  • 我非常困惑为什么gcc会为const数组上的简单for循环生成这种(看似)非最佳代码。 结果: 我主要关心的是: 为什么无用的第一个元素比较在?这永远不会命中,也永远不会被分支回。它最终只是第一次迭代的重复代码。 < li >有没有更好的方法来编写这个非常简单的循环,这样gcc就不会产生这种奇怪的代码? < li >有没有我可以利用的编译器标志/优化?< code>O3只是展开循环,我也不希望这样

  • 问题内容: 我在评估我的Java代码时遇到了一个大问题。为了简化问题,我编写了以下代码,它们产生相同的奇怪行为。重要的是方法run()和给定的双倍价值率。对于运行时测试(在main方法中),我将速率设置为0.5倍,另一次设置为1.0。如果值为1.0,则将在每次循环迭代中执行if语句;如果值为0.5,则将执行一半的if语句。因此,在第一种情况下,我希望运行时更长,但事实恰恰相反。谁能解释这个现象?

  • 所以我更新了代码,添加了行所做的是将主线程置于Hibernate状态一段时间,因此jvm可以获得一些时间来创建一个新线程。我正在得到我的预期输出

  • 所以我在做这个素数家庭作业,举了一个很好的例子,我想我已经把大部分都记下来了。我遇到的一件事是“公共静态空隙筛(int n)”一行的错误,这也发生在“私有静态int twinPrime()”中 代码如下: 以下是错误: void是变量筛的无效类型 预期令牌 "(", ; 语法错误 令牌 “)” 上的语法错误, ;预期 和 标记“int”语法错误,应为@ 语法错误,请插入“EnumBody”以完成B