public static void main(String... args)
{
System.out.println(0.5==0.5f);
}
Выход: true
public static void main(String... args)
{
System.out.println(0.1==0.1f);
}
Выход: false
Почему так происходит?
Ответ 1
Вы сравниваете два типа значений: double и float.
Подумайте об ограничениях размера с неточными числами.
Пример:
Точные значения (десятичные)
value1 → 1/2 с 5 десятичными знаками - 0,50000 value2 → 1/2 с 10 десятичными знаками составляет 0,5000000000
то
value1 == value2 → возвращает true
Неточные значения (десятичные)
value3 → 1/3 с 5 десятичными знаками - 0.33333 value4 → 1/3 с 10 десятичными знаками - 0.3333333333
затем
value3 == value4 → возвращает false, потому что они не совпадают.
0,1 не может точно представлять собой двоичный файл (например, 1/3 в десятичной форме), но может быть 0,5.
Двоичное представление 0.1d → 0.000 (1100) 1100110011...
Бинарное представление 0.5d → 0,1
Ответ 2
Это связано с тем, что числа с плавающей запятой представлены в форме c*2^q. 0.5 может быть представлен как 1*2^-1, а 0.1 невозможно точно определить независимо от того, насколько велики вы делаете c и q.
При сравнении поплавка с двойным, float приводится к двойному. Если число, которое представлено, уже корректно представляется как float, оно будет иметь такое же значение при двойном, но если нет, double будет иметь некоторые дополнительные значащие цифры и, следовательно, будет сравнивать не равные.