thể trùng lặp:
C# Why can equal decimals produce unequal hash values?Decimal.GetHashCode phụ thuộc vào Trailing Zero
Tôi đã gặp sự cố trong tôi NET 3.5 ứng dụng (x86 hoặc x64, tôi đã cố gắng cả hai) trong đó số thập phân có số lượng dấu 0 khác nhau có các mã băm khác nhau. Ví dụ:
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());
đầu ra sau trên máy tính của tôi:
1085009409
1085009408
True
False
tôi đoán sự khác biệt về mã băm là xuống đến cơ quan đại diện nội bộ khác nhau của hai con số gây ra bởi các yếu tố quy mô khác nhau.
Trong khi tôi có thể khắc phục sự cố bằng cách xóa các số không theo sau, tôi luôn giả định rằng GetHashCode phải trả về cùng giá trị cho x và y, nếu x == y. Giả định này sai, hay đây là một vấn đề với Decimal.GetHashCode?
EDIT: Để rõ ràng trên các phiên bản tôi đang sử dụng Visual Studio 2008 SP1, .NET 3.5.
Đây có phải là mã thực của bạn không? Điều này trả về '1085009408, 1085009408, True True' cho tôi. - Chỉnh sửa: đó là .NET 4, các kết quả khác nhau trên .NET 3.5 đã được xác nhận. – CodeCaster
Tôi nhận được kết quả tương tự như OP trên .NET 3.5. @CodeCaster, bạn đang chạy phiên bản nào? – Servy
Vì vậy, tôi đã đi và xem xét các bit thập phân và chúng khác nhau cho x và y (với .NET trước 3.5). Rõ ràng phương thức 'Equals' cho sự khác biệt này, nhưng' GetHashCode' thì không. – Servy