1

我有这个 for 循环:

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

x初始化为 -20 并与 20 进行比较。理想情况下,我希望x递增为 -20、-19.9、-19.8 等。实际上,这不是发生的情况;在某些迭代中,小数点后确实只有一位,但在其他迭代中,它并不精确,例如 -19.8999999。这导致了我的程序中一些非常烦人(而且很难找到)的错误。

我怎样才能让它x保持“相对圆润”?

4

7 回答 7

4

不要使用double或者float如果您需要这种准确性 - 请decimal改用。

发生这种情况是因为某些分数无法用二进制准确表示 - 我建议阅读每个计算机科学家应该知道的关于浮点算术的知识

于 2013-01-04T21:22:15.070 回答
2

这与 adouble的存储方式有关。换一个试试decimal

于 2013-01-04T21:22:38.203 回答
2

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

UPD:使用 Decimal 可能更好。

于 2013-01-04T21:23:20.637 回答
1

如果我理解你的话......为什么你只是围绕它?

Math.Round(x,1)
于 2013-01-04T21:26:12.613 回答
0

浮点数(Double/Float)不准确,而是使用 -200 和 200 作为 int。这将使您不必担心缺乏浮点精度。

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

于 2013-01-04T21:25:21.963 回答
0

如果您真的希望它尽可能精确地放大,以便您可以使用intlong......例如:

long _Z = (long) ((display.Width * 10) / zoom);

for (long _x = -1 * _Z; _x <= _Z; _x += 1)
{
    double x = ((double)_x) / 10.0;
    // ...

}
于 2013-01-04T21:25:59.677 回答
0

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

double x = 0.0;
while (x <= 3.0)
{
   //Do your stuff
   x = Math.Round(x + 0.1, 1);
}
于 2017-01-01T11:08:35.780 回答