Это из-за того, что десятичное число не может быть точно представлено в двоичном формате с основанием 2?
да. По сути, 5.4f и 5.4d не одинаковы, потому что ни один из них не является точным представлением 5.4.
5.5f и 5.5d одинаковы, потому что они оба являются точным представлением 5.5.
Обратите внимание, что 5.4 неявно совпадает с 5.4d - типом по умолчанию для литерала с плавающей запятой является double. Любое использование бинарного оператора с операндами float и double повысит float до double и выполнит операцию с двумя значениями double.
Это может упростить представление об этом в терминах десятичных типов. Предположим, у нас есть два типа, Decimal5 и Decimal10, которые представляют собой десятичные числа с 5 или 10 значащими цифрами. Затем рассмотрим «треть» и «четверть»:
A third:
Decimal5: 0.33333
Decimal10: 0.3333333333
A quarter (showing trailing zeroes just for clarity):
Decimal5: 0.25000
Decimal10: 0.2500000000
При сравнении значения Decimal5, ближайшего к третьему, со значением Decimal10, значение Decimal5 будет преобразовано в значение Decimal10, равное 0,3333300000, что не равно 0,3333333333. Это похоже на ваш первый пример.
Однако при сравнении значений для квартала значение Decimal5 0,25000 преобразуется в 0,2500000000, что совпадает со значением Decimal10, которое мы имеем для квартала. Это похоже на ваш второй пример.
Конечно, двоичные типы с плавающей запятой немного сложнее, чем это, с нормализацией, субнормальными числами и т.д., но для целей вашего примера эта аналогия достаточно близка.
person
Jon Skeet
schedule
19.09.2013