一些数字后公式停止工作

时间:2012-08-22 09:08:28

标签: c# floating-point

  

可能重复:
  Why is floating point arithmetic in C# imprecise?
  Why can't decimal numbers be represented exactly in binary?

我不明白为什么,这个公式有效,直到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 个答案:

答案 0 :(得分:3)

通过==比较浮点数永远不是一个好主意。

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

然后d1!= d2,因为0.33没有精确表示为double,因为double是二进制浮点数,并且可能是0.66的双重表示与0.33的双重表示的两倍不同。

使用小数。

尝试改进您的代码。在我看来,增加循环中的计数器并在for循环的头部使用第三个位置用于不同的目的是可怕的风格。

答案 1 :(得分:0)

我假设Rec为double,其初始值为0。比

Insted of

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

使用

 if (Math.Abs(Rec-(int)Rec-0.66) < 0.001)

答案 2 :(得分:0)

简单解决方案:将Rec从double更改为decimal。如果是这样,你还必须改变0.66到0.66m和0.33到0.33m。

答案 3 :(得分:-1)

即使数字“相等”,

Rec == (int)Rec + 0.66也可以是false。它与浮点数二进制表示有关。必须以略微不同的方式比较浮点数:

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

其中epsilon是一个小值,在这种情况下0.1就足够了。