为什么1.2#0.1在C#中变为1.09?

时间:2013-10-17 11:34:50

标签: c# double

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

我多次调用例行程序:

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

然后是时候执行ZoomLevel等于1.2的相同语句: enter image description here

然后我跳过声明:

enter image description here

为什么此语句的评估值为1.09而不是1.1?

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

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

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

2 个答案:

答案 0 :(得分:2)

这是因为双精度数是二进制浮点数。因为我们人类喜欢看十进制的数字,所以它们会被转换为十进制数,但是转换对于某些值来说并不准确。因此可能会发生舍入错误。

答案 1 :(得分:0)

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

你必须阅读一些关于.NET的双重内容。