这是我的一段代码,它每隔一秒调用一次,大约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],但这不应该保留???
答案 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());
}
这将确保您每次都有一个新的“除数”,并且不会受到其他范围的影响。