繁体   English   中英

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

[英]Print on last iteration of 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递增1时,它可以正常工作。 但是当我做我+ = 0.1时它不会打印f。 有什么想法吗?

您不能像这样比较浮点数。

通常,两个浮点数(双精度)的相等性用类似以下方法检查

如果(Math.abs(i-bg)<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除以3​​时,将得到0.333 ...,因为您使用的是十进制数字系统。

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

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

在我的图形工具中,我将遍历一个整数值并即时计算浮点数:

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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM