0

可能重复:
为什么 C# 中的浮点运算不精确?
为什么十进制数不能用二进制精确表示?

我不明白为什么,这个公式一直有效,直到 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 没有作为双精度的精确表示,因为双精度是二进制浮点数,并且可能 0.66 的双精度表示不同于 0.33 的双精度表示的两倍。

使用小数。

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

于 2012-08-22T09:15:04.473 回答
0

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

于 2012-08-22T09:19:36.217 回答
0

我假设 Rec 是double并且它的初始值是0。比

安装在

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

利用

 if (Math.Abs(Rec-(int)Rec-0.66) < 0.001)
于 2012-08-22T09:16:01.213 回答
-1

Rec == (int)Rec + 0.66false即使数字“相等”也可以。它与浮点数二进制表示有关。浮点数必须以稍微不同的方式进行比较:

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

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

于 2012-08-22T09:16:11.100 回答