在for循环的最后一次迭代上打印

时间:2012-09-30 17:32:07

标签: java for-loop

所以我有一个简单的for循环:

  double bg = 5.0;
  double f = 0.0;
  for(double i = 0; i <= bg; i += 1)
    {
        f = f + ((2 * i + 1)*0.1);

        if(i == bg)
        {
            System.out.printf ("%.1f" , f);
        }
    }

当我每次增加i时,它会正常工作。 但是,当我做+ + = 0.1时,它不会打印f。 有什么想法吗?

3 个答案:

答案 0 :(得分:5)

你无法比较那样的花车。

通常用

之类的东西检查两个浮点数(双精度数)的相等性

如果(Math.abs(i - bg)&lt; 0.00001f)//0.00001f值非常小 - 几乎为零,请选择此值以满足您的需求

有关http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm

的更多信息,请参阅

您的代码应该是

  double bg = 5.0;
  double f = 0.0;
  for(double i = 0; i <= bg; i += 1)
    {
        f = f + ((2 * i + 1)*0.1);

        if (Math.abs(i - bg) < 0.00001f)
        {
            System.out.printf ("%.1f" , f);
        }
    }

答案 1 :(得分:1)

浮点数没有您认为可能的所有数字的精确表示。例如,当将1除以3​​时,得到0.333 ...因为您使用十进制数字系统。

然而,计算机使用二进制,所以即使0.1看起来像一个简单而准确的数字,二进制它看起来更像0.0001100011 ......,依此类推到无穷大。并且,由于计算机没有无限的内存,因此该数字四舍五入到最接近的可能表示。这就是为什么精确的比较不起作用。

有很多方法可以解决这个问题。一种选择是使用已经提到的增量比较。但是,如果您知道您只处理小数点后最多数字的数字,则可以改为将所有数字乘以100使用整数。例如,如果您正在进行货币计算,这是建议的方式。

答案 2 :(得分:0)

在我的图形工具中,我将迭代一个整数值并动态计算浮点数:

int bg = 5;
double f = 0.0;
for(int i = 0; i <= bg; i += 1) {
    f = f + ((2 * i + 1)*0.1);

    if(i == bg)
    {
        System.out.printf ("%.1f" , f);
    }
}