我有一个相当简单的表达式,我想要评估哪个是ZoomLevel = ZoomLevel - 0.1,其中ZoomLevel被声明为double。
我多次调用例行程序:
然后是时候执行ZoomLevel等于1.2的相同语句:
然后我跳过声明:
为什么此语句的评估值为1.09而不是1.1?
(我想这与双重实现中缺乏精确性有关。)
编辑:这是我在执行该语句之前和之后打印ZoomLevel内容时得到的结果。
?string.Format("{0:N20}", ZoomLevel);
"1,20000000000000000000"
?string.Format("{0:N20}", ZoomLevel);
"1,09000000000000000000"
答案 0 :(得分:2)
这是因为双精度数是二进制浮点数。因为我们人类喜欢看十进制的数字,所以它们会被转换为十进制数,但是转换对于某些值来说并不准确。因此可能会发生舍入错误。
答案 1 :(得分:0)
我打赌它实际上是1.0999(9)。
你必须阅读一些关于.NET的双重内容。