当在for循环中增加一个双值时,如何确保它保持相对圆

本文关键字:何确保 确保 相对 增加 循环 for 当在 一个 | 更新日期: 2023-09-27 17:50:39

我有这个循环:

for (double x = -1 * (display.Width / zoom); x <= (display.Width / zoom); x += 0.1)
{
    //..
}

CCD_ 1被初始化为-20并且与20进行比较。理想情况下,我希望x增加为-20、-19.9、-19.8等。在实践中,情况并非如此;在某些迭代中,小数点后确实只有一位数字,但在其他迭代中,它并不那么精确,例如-19.8999999。这是我的程序中一些非常令人恼火(而且很难找到(的错误的原因。

如何使x保持"相对圆"?

当在for循环中增加一个双值时,如何确保它保持相对圆

如果需要这种精度,请不要使用doublefloat,而是使用decimal

之所以会出现这种情况,是因为某些分数无法准确地用二进制表示——我建议阅读《每个计算机科学家都应该知道的浮点运算》。

这与double的存储方式有关。请尝试decimal

使用整数循环计数器,初始化为-200并与200进行比较,并在每次迭代中计算实际的x

UPD:使用Decimal可能更好。

如果我理解得对。。。你为什么要绕过它?

Math.Round(x,1)

浮点数字(双精度/浮点(不准确,而是使用-200和200作为int。这样就不必担心浮点精度不足。

有关这种不精确性的更多信息,我建议使用此文档。http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

如果您真的希望它尽可能精确,请将其放大,以便您可以使用x0或long。。。例如:

long _Z = (long) ((display.Width * 10) / zoom);
for (long _x = -1 * _Z; _x <= _Z; _x += 1)
{
    double x = ((double)_x) / 10.0;
    // ...
}

如果你必须使用double,你可以这样使用:

double x = 0.0;
while (x <= 3.0)
{
   //Do your stuff
   x = Math.Round(x + 0.1, 1);
}