C#除法有问题吗?

C#除法有问题吗?,c#,C#,这是我的一段代码,每秒调用一次,大约10秒后,值开始变得奇怪(见下文): 双a; 双b; 对于(int i=0;i

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

双a;
双b;
对于(int i=0;i
以及输出:

a=-0.05b=0.00

除数=41

a+b=-0.0524010372273268

currAC和Aveac值是双精度[]

到底发生了什么事????每次加法的结果都是正确的,但除法值是错误的,但它读取的a和b是正确的


编辑:“41”是第一次计算的值,即当a=currAC[0]时,但这不应保留???
double
由于规范的原因,可能会导致不精确的结果(请参阅)。您可能希望使用十进制,因为它提供了更高的精度。

double
由于规范的原因,可能会导致不精确的结果(请参阅)。您可能想使用十进制,它提供了更高的精度。

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


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

如果b==-0.001219512195122,则a/b==41,且a+b=-0.051219512195122-因此这些区域周围的某些东西(舍入等)听起来是可行的


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

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

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()); 
} 
for(int i=0;i

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

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

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()); 
} 
for(int i=0;i


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

您可以将除数除以零。上帝保佑你。我认为这是一个非常接近于零的近似值。那么,.05/~0将产生一个合理的大数字。我不明白。如果b是0.00,这不是一个被零除的除法吗?不,因为它实际上是0.00xxxxx,我将Console.WriteLine四舍五入到两位小数
Console.WriteLine(-0.05f/0.00f)显示
-Infinity
对于我来说,首先,如果你真的提供了一个小的、完整的、可以工作的程序来演示你所遇到的问题,它会变得容易得多;然后人们可以分析它,而不是试图猜测。第二,你把a/b叫做除数,而实际上它是商,这一事实非常令人困惑。除数是b,被除数是a,a/b是商。你除以零。上帝保佑你。我认为这是一个非常接近于零的近似值。那么,.05/~0将产生一个合理的大数字。我不明白。如果b是0.00,这不是一个被零除的除法吗?不,因为它实际上是0.00xxxxx,我将Console.WriteLine四舍五入到两位小数
Console.WriteLine(-0.05f/0.00f)显示
-Infinity
对于我来说,首先,如果你真的提供了一个小的、完整的、可以工作的程序来演示你所遇到的问题,它会变得容易得多;然后人们可以分析它,而不是试图猜测。第二,你把a/b叫做除数,而实际上它是商,这一事实非常令人困惑。除数是b,被除数是a,a/b是商。嗨,但这能回答为什么会记住值41吗?不是真的,但我们需要知道除数是如何定义的。我不认为他使用的是基数为2的浮点数和基数为10的浮点数有什么区别
decimal
只有在您有兴趣将数字四舍五入到某个以10为基数的表示位数时才是“更好”的。您好,但这能回答为什么会记住值41吗?不太可能,但我们需要知道除数是如何定义的,我不认为他使用的是以2为基数的浮点数和以10为基数的浮点数有什么区别
decimal
只有在您有兴趣将数字四舍五入到某个以10为基数的表示位数时才真正“更好”。嘿,伙计们,你们误解了我的问题-问题是,即使循环在下一次运行时结束,第一次除法的结果仍会被记住,它总是41或任何数字在第一位…@Tom-什么让你认为它不是正确的值?我的意思是-有一些值a/b会将这些值显示为2dp,并给出除数。嘿,伙计们,你们误解了我的问题-问题是第一次除法的结果会被记住,即使循环在下一次运行时完成,它总是