【发布时间】:2012-11-08 14:18:24
【问题描述】:
这让我很惊讶 - 相同的算法会根据其执行方式给出不同的结果:
> 0.1f+0.2f==0.3f
False
> var z = 0.3f;
> 0.1f+0.2f==z
True
> 0.1f+0.2f==(dynamic)0.3f
True
(在 Linqpad 中测试)
发生了什么事?
编辑:我明白为什么浮点运算不精确,但不明白为什么它会不一致。
古老的 C 可靠地确认 0.1 + 0.2 == 0.3 适用于单精度浮点数,但不适用于双精度浮点数。
【问题讨论】:
-
-1:这个副本太多了。只需查看侧边栏和标题相关下的链接
-
@DanielHilgarth 在我看来这不是关于浮点的常见问题,而是关于编译器执行的计算与运行时执行的计算之间的差异
-
@DanielHilgarth:您不能简单地将涉及浮点的所有内容都视为浮点不精确。一些浮点问题是解释浮点如何运作的机会。请注意,这个问题表明
0.1f+0.2f和x都具有Single类型。所以有一个问题,为什么0.1f+0.2f的赋值似乎没有保留值,即使类型没有改变。这是 C# 语义的问题。你能显示一个精确的副本吗?如果您可以识别出完全重复,那么建议将此问题作为完全重复来解决。 -
这个问题由this Eric Lippert answer 回答,是一个类似但不完全重复的问题。
标签: c# .net floating-point