Мы столкнулись с магическим десятичным числом, которое нарушило нашу хэш-таблицу. Я отбросил его до следующего минимального случая:
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;
Но мой вопрос: как С# делает это неправильно?