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

为什么使用double的for循环无法终止

姜嘉赐
2023-03-14
问题内容

我正在浏览旧的考试问题(当前是大学一年级),我想知道是否有人可以更彻底地解释为什么以下for循环在预期的情况下不会结束。为什么会这样?我了解由于舍入错误或其他原因,它会跳过100.0,但是为什么呢?

for(double i = 0.0; i != 100; i = i +0.1){
    System.out.println(i);
}

问题答案:

数字0.1不能精确地用二进制表示,就像1/3不能精确地用十进制表示一样,因此您不能保证:

0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1==1

这是因为在二进制文件中:

0.1=(binary)0.00011001100110011001100110011001....... forever

但是,双精度数不能包含无限精度,因此,正如我们将1/3近似为0.3333333一样,二进制表示也必须近似为0.1。

扩展的十进制类比

用小数点可能会发现

1/3+1/3+1/3
=0.333+0.333+0.333
=0.999

这是完全相同的问题。不应将其视为浮点数的弱点,因为我们自己的十进制系统具有相同的困难(但是对于不同的数,使用3底数制的人会感到奇怪,我们很难代表1/3)。但是,这是一个要注意的问题。

演示版

一个现场演示由安德烈Ligios提供显示这些错误建立。



 类似资料:
  • 我在尝试一个测试,我写了这个程序。。。 六羟甲基三聚氰胺六甲醚。。。在下面的代码中,我知道我用了“I”而不是“j”,所以为了解决这个问题,我用了这个 我在节目中遇到的问题是- 在上面的代码中,当我删除这个if块时- 这个节目无限期地进行。。。。。。。。。但当我再次放置这个if块时,程序在执行一段时间后自动终止。我也在这个链接上读到了这一点,但它展示了java的例子 它们显示了负值的原因,但在我的程

  • 问题内容: 在包含forEach循环的行上引发了出站异常,但是据我所知,此代码没有错。for循环从char数组的元素0开始,一直循环直到到达最后一个元素…但是当我尝试使用更长的for循环来执行此代码时,即 该代码按预期工作。 为什么在这种情况下for循环起作用,而forEach循环不起作用? 问题答案: 如果您需要在循环中使用索引访问某些内容,请使用for,而不是foreach(已增强)。 现在,

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 当我开始我的代码 我得到无限循环。为什么?

  • 问题内容: 我读到 增强的for循环 比普通的 for循环 更有效: http://developer.android.com/guide/practices/performance.html#foreach 当我搜索它们的效率之间的差异时,我发现的是:如果是普通的for循环,我们需要一个额外的步骤来找出数组的长度或大小等, 但这是唯一的原因,增强的for循环优于普通的for循环吗?在那种情况下,

  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接