【问题标题】:for-loop, increment by doublefor循环,加倍
【发布时间】:2011-04-27 15:38:41
【问题描述】:

我想使用 for 循环来解决我的问题,而不是 while。是否可以执行以下操作?:

for(double i = 0; i < 10.0; i+0.25)

我想添加双精度值。

【问题讨论】:

  • 请记住,由于舍入错误(我知道用词不当),您很可能不会以一个不错的整数结尾。
  • 碰巧i 在你的程序中获取的所有值都可以完全表示为double 值,但是用浮点索引编写循环是一个坏习惯大大地。如果您不想看到奇怪的结果,浮点需要比这更小心。例如见mc.edu/campus/users/travis/syllabi/381/patriot.htm
  • @Blindy 对于这个精确的程序,是的,他会的。对于稍微不同的程序,他不会。
  • 我要计算一个圆的面积和轮廓,直径是参数,从1开始到10结束,应该递增0.25
  • 你误解了浮点问题的本质。

标签: java for-loop double


【解决方案1】:

对于整数。 我们可以使用:for (int i = 0; i &lt; a.length; i += 2)

for (int i = 0; i < a.length; i += 2) {
            if (a[i] == a[i + 1]) {
                continue;
            }
            num = a[i];
        }

我们也可以对其他数据类型做同样的事情。

【讨论】:

    【解决方案2】:

    for (double i = 0f; i < 10.0f; i +=0.25f) {
     System.out.println(i);
    

    f 表示float

    添加的=表示i = i + 0.25的快捷方式;

    【讨论】:

      【解决方案3】:

      您可以改用i += 0.25

      【讨论】:

      • 来找这个!!
      【解决方案4】:
      for(double i = 0; i < 10.0; i+=0.25) {
      //...
      }
      

      添加的 = 表示 i = i + 0.25 的快捷方式;

      【讨论】:

        【解决方案5】:

        詹姆斯的回答发现了最明显的错误。但是还有一个更微妙(而且 IMO 更有启发性)的问题,即不应该比较浮点值的(不)相等性。

        那个循环很容易出现问题,只使用一个整数值并在循环内计算双精度值;或者,不太优雅,给自己一些余地:for(double i = 0; i &lt; 9.99; i+=0.25)

        编辑:原始比较恰好工作正常,因为 0.25=1/4 是 2 的幂。在任何其他情况下,它可能无法准确表示为浮点数。 (潜在)问题的一个例子:

         for(double i = 0; i < 1.0; i += 0.1) 
             System.out.println(i); 
        

        打印 11 个值:

        0.0
        0.1
        0.2
        0.30000000000000004
        0.4
        0.5
        0.6
        0.7
        0.7999999999999999
        0.8999999999999999
        0.9999999999999999
        

        【讨论】:

        • 原问题有i &lt; 10.0。你能再解释一下关于浮点相等的标准演讲是如何应用在这里的吗? (请注意,当您的浮点计算准确时,使用相等是完全安全的)。
        • '当你的浮点计算是精确的'是一个棘手的句子。因为您必须确保您的十进制数接受 Java 浮点数格式的精确表示(0.25 恰好承认,0.2 或 0.1 不承认)我添加了一个示例。
        • 我试图了解添加 0.01 有何帮助。如果计算不准确,则浮点结果很可能低于实际结果,因此您的“修复”可能会导致循环中的额外迭代与程序员的意图相比已经有太多迭代。
        • @Pascal:你是对的!不过,我已经纠正了。无论如何,这也是不好的做法。
        【解决方案6】:

        为防止被浮点运算的伪影所困扰,您可能需要使用整数循环变量并在循环中导出所需的浮点值:

        for (int n = 0; n <= 40; n++) {
            double i = 0.25 * n;
            // ...
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-15
          • 2017-09-19
          • 1970-01-01
          相关资源
          最近更新 更多