0

我有一个相当简单的表达式,我想评估它是 ZoomLevel = ZoomLevel - 0.1 其中 ZoomLevel 被声明为双精度。

我已经多次调用该例程:

  • 1.5 - 0.1 = 1.4
  • 1.4 - 0.1 = 1.3
  • 1.3 - 0.1 = 1.2

然后是时候执行 ZoomLevel 等于 1.2 的相同语句了: 在此处输入图像描述

然后我跳过声明:

在此处输入图像描述

为什么这个语句的计算结果是 1.09 而不是 1.1?

(我想这与双重实现中缺乏精度有关。)

编辑:这是我在执行该语句之前和之后打印 ZoomLevel 的内容时得到的。

?string.Format("{0:N20}", ZoomLevel);
"1,20000000000000000000"
?string.Format("{0:N20}", ZoomLevel);
"1,09000000000000000000"
4

2 回答 2

2

这是因为双精度数是二进制浮点数。由于我们人类喜欢以十进制形式查看数字,因此它们会与十进制进行转换,但对于某些值,这种转换并不精确。因此可能会出现舍入错误。

于 2013-10-17T11:38:23.300 回答
0

我打赌它实际上是 1.0999(9)。

您必须阅读一些关于.NET 中的 double 的内容。

于 2013-10-17T11:38:33.010 回答