【发布时间】:2011-12-16 11:19:40
【问题描述】:
我们遇到了一个神奇的十进制数,它破坏了我们的哈希表。我将其归结为以下最小情况:
decimal d0 = 295.50000000000000000000000000m;
decimal d1 = 295.5m;
Console.WriteLine("{0} == {1} : {2}", d0, d1, (d0 == d1));
Console.WriteLine("0x{0:X8} == 0x{1:X8} : {2}", d0.GetHashCode(), d1.GetHashCode()
, (d0.GetHashCode() == d1.GetHashCode()));
给出以下输出:
295.50000000000000000000000000 == 295.5 : True
0xBF8D880F == 0x40727800 : False
真正奇怪的是:更改、添加或删除 d0 中的任何数字,问题就消失了。甚至添加或删除尾随零之一!不过,这个标志似乎并不重要。
我们的解决方法是将值除以去除尾随零,如下所示:
decimal d0 = 295.50000000000000000000000000m / 1.000000000000000000000000000000000m;
但我的问题是,C# 怎么做错了?
编辑: 刚刚注意到这已在 .NET Core 3.0 中修复(可能更早,我没有检查):https://dotnetfiddle.net/4jqYos
【问题讨论】: