0

重複の可能性:
C# の浮動小数点演算が不正確なのはなぜですか?
10 進数を 2 進数で正確に表現できないのはなぜですか?

理由がわかりません。この式は Scrap = 51 になるまで機能します。Rec は 17 になるはずですが、16.99 になります。

Scrap = int.Parse(textBoxS.Text);

for (counter = 0; counter < Scrap; textBoxRec.Text = Rec.ToString() )
{
    if (Rec == (int)Rec + 0.66)
    {
        Rec = (int)Rec + 1;
        counter++;
    }
    else
    {
        Rec = Rec + 0.33;
        counter++;
    }
}
4

4 に答える 4

3

== による浮動小数点数の比較は決して良い考えではありません。

double d1 = 16.0 + 0.33 + 0.33
double d2 = 16.0 + 0.66

次に、d1 != d2 です。これは、0.33 が double として正確に表現されていないためです。これは、double が 2 進浮動小数点数であり、おそらく 0.66 の double 表現が 0.33 の double 表現の 2 倍と異なるためです。

10 進数を使用します。

そして、コードを改善してみてください。私の意見では、ループ内でカウンターを増やし、for ループの先頭の 3 番目の位置を別の目的で使用するのは恐ろしいスタイルです。

于 2012-08-22T09:15:04.473 に答える
0

doubleRecはであり、その初期値はであると仮定します0。よりも

の挿入

if (Rec == (int)Rec + 0.66)

使用する

 if (Math.Abs(Rec-(int)Rec-0.66) < 0.001)
于 2012-08-22T09:16:01.213 に答える
0

簡単な解決策: Rec を double から decimal に変更します。その場合は、0.66 を 0.66m に、0.33 を 0.33m に変更する必要もあります。

于 2012-08-22T09:19:36.217 に答える
-1

Rec == (int)Rec + 0.66false数が「等しい」場合でも可能です。これは、浮動小数点数の2進表現に関連しています。浮動小数点数は、わずかに異なる方法で比較する必要があります。

if (Math.Abs(Rec - ((int) Rec + 0.66)) < epsilon) ...

ここで、イプシロンは小さな値ですが、この場合0.1は十分です。

于 2012-08-22T09:16:11.100 に答える