【发布时间】:2012-07-02 16:44:17
【问题描述】:
我在 .NET 3.5 应用程序(x86 或 x64,我都尝试过)中遇到了一个问题,其中尾随零数量不同的小数具有不同的哈希码。例如:
decimal x = 3575.000000000000000000M;
decimal y = 3575.0000000000000000000M;
Console.WriteLine(x.GetHashCode());
Console.WriteLine(y.GetHashCode());
Console.WriteLine(x == y);
Console.WriteLine(x.GetHashCode() == y.GetHashCode());
在我的机器上输出以下内容:
1085009409
1085009408
True
False
我认为哈希码的差异是由于不同的比例因子导致的两个数字的不同内部表示。
虽然我可以通过删除尾随零来解决此问题,但我始终假设 GetHashCode 应该为 x 和 y 返回相同的值,如果 x == y。这个假设是错误的,还是 Decimal.GetHashCode 的问题?
编辑:要清楚我使用 Visual Studio 2008 SP1、.NET 3.5 的版本。
【问题讨论】:
-
这是您的实际代码吗?这将为我返回
1085009408, 1085009408, True True。 - 编辑:那是 .NET 4,.NET 3.5 上的不同结果得到确认。 -
我得到了与 .NET 3.5 上的 OP 相同的输出。 @CodeCaster,你在哪个版本上运行它?
-
所以我去查看了小数位,它们对于 x 和 y 是不同的(使用 .NET pre 3.5)。显然,
Equals方法解释了这种差异,但GetHashCode没有。 -
@CodeCaster 是的,从外观上看,它是一个副本。我在发布之前确实搜索了类似的问题,但错过了,很好的发现。