当在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
保持"相对圆"?
如果需要这种精度,请不要使用double
或float
,而是使用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
如果您真的希望它尽可能精确,请将其放大,以便您可以使用x
0或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);
}