C#是否存在划分问题?

时间:2010-06-06 22:44:00

标签: c#

这是我的一段代码,它每隔一秒调用一次,大约10秒后值开始变得怪异(见下文):

double a;
double b;

for (int i = 0; i < currAC.Length; i++ )
{                 
    a = currAC[i];
    b = aveACValues[i];
    divisor = (a/b);
    Console.WriteLine("a = " + a.ToString("N2") + "\t" + "b = " + b.ToString("N2"));
    Console.WriteLine("divisor = " + divisor);
    Console.WriteLine("a+b = " + (a+b));
}

和输出:

a = -0.05 b = 0.00

divisor = 41

a + b = -0.0524010372273268

currAC和aveACValues是双倍[]

到底是怎么回事?每次添加结果都是正确的,但除法值是错误的,但它正确地读取a和b ??

编辑:'41'是第一次计算的值,即a = currAC [0],但这不应该保留???

3 个答案:

答案 0 :(得分:5)

如果b == -0.001219512195122,那么a / b == 41,而a + b == - 0.051219512195122 - 所以围绕那些区域(舍入等)听起来是可行的......

也;请注意,对于某些算术,可能使用仍在寄存器中的值。寄存器可能表现出与局部变量略有不同的准确度(因此给出不同的结果)。

答案 1 :(得分:0)

由于规范的原因,

double会导致不精确的结果(请参阅msdn)。您可能希望使用decimal,它可以提供更高的精确度。

答案 2 :(得分:0)

如果变量被声明为尽可能接近它们使用的位置会发生什么?

for (int i = 0; i < currAC.Length; i++ ) 
{                  
    double a = currAC[i]; 
    double b = aveACValues[i]; 
    double divisor = (a/b); 
    Console.WriteLine("a = " + a.ToString("N2") + "\t" + "b = " + b.ToString("N2")); 
    Console.WriteLine("divisor = " + divisor.ToString()); 
    Console.WriteLine("a+b = " + (a+b).ToString()); 
} 

这将确保您每次都有一个新的“除数”,并且不会受到其他范围的影响。