可能重复:
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++;
}
}
答案 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
就足够了。