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

そのようなフロートを比較することはできません。

通常、2 つの浮動小数点数 (倍精度浮動小数点数) が等しいかどうかは、次のような方法でチェックされます。

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 で割ると、10 進数の数値システムを使用しているため、0.333... が得られます。

ただし、コンピューターは 2 進数を使用するため、0.1 は書きやすい正確な数値のように見えますが、2 進数では 0.0001100011... のように見え、無限に続きます。また、コンピュータには無限のメモリがないため、この数値は可能な限り近い表現に丸められます。そのため、正確な比較は機能しません。

この問題に対処する方法はいくつかあります。1 つのオプションは、既に述べたデルタ比較を使用することです。ただし、小数点以下の桁数までしか処理しないことがわかっている場合は、代わりに整数を使用してすべてに 100 を掛けることができます。これは、たとえば金銭の計算を行う場合に推奨される方法です。

于 2012-09-30T17:42:54.093 に答える
0

私のグラフィカル ツールでは、整数値を反復処理し、float をオンザフライで計算します。

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 に答える