0

所以我有一个简单的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 时,它工作正常。但是当我执行 i += 0.1 时,它不会打印 f。任何想法为什么?

4

3 回答 3

5

你不能像那样比较花车。

通常用类似的东西检查两个浮点数(双精度)的相等性

if (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);
        }
    }
于 2012-09-30T17:35:42.790 回答
1

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

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

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

于 2012-09-30T17:42:54.093 回答
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);
    }
}
于 2012-09-30T17:46:16.683 回答