Я протестировал это в VB.NET (v3.5) и получил то же самое.
Интересная вещь о хэш-кодах:
A) 0x40727800 = 1081243648
B) 0xBF8D880F = -1081243648
Использование Decimal.GetBits () Я нашел
формат: мантисса (хххххххххххххххххххххххххх), 'e' является показателем степени, 0 должно быть нулями)
d1 ==> 00000000 00000000 00000B8B - 00010000 = (2955/10 ^ 1) = 295,5
do ==> 5F7B2FE5 D8EACD6E 2E000000- 001A0000
... который преобразуется в 29550000000000000000000000000/10 ^ 26 = 295.5000000 ... и т. Д.
** редактировать: хорошо, я написал 128-битный шестнадцатеричный калькулятор и вышеточно правильно
Это определенно похоже на внутреннюю ошибку преобразования какого-то рода.Microsoft прямо заявляет, что не гарантирует реализацию по умолчанию GetHashCode.Если вы используете его для чего-то важного, то, вероятно, имеет смысл написать собственный GetHashCode для десятичного типа.Форматирование его с фиксированным десятичным знаком, строка фиксированной ширины и хеширование, кажется, работают, например (> 29 знаков после запятой,> 58 ширины - подходит для всех возможных десятичных знаков).
* edit: Iне знаю об этом больше.Это все еще должна быть ошибка преобразования где-то, поскольку сохраненная точность фундаментально изменяет реальное значение в памяти.То, что хеш-коды заканчиваются как подписанные отрицания друг друга, является большой подсказкой - нужно поискать больше в реализации хэш-кода по умолчанию, чтобы найти больше.
28 или 29 цифр не должны иметь значения, если нет зависимыхкод, который не оценивает внешние экстенты должным образом.Самое большое доступное 96-битное целое число:
79228162514264337593543950335
, поэтому вы можете иметь 29 цифр, если целое число (без десятичной точки) меньше этого значения.Я не могу не думать, что это что-то более тонкое в вычислении хеш-кода где-то.