Подтвердить что ты не робот

Почему 0.5 == 0.5f истинно, но 0.1 == 0.1f ложно?

Посмотрите на два кода:

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

Почему так происходит?

4b9b3361

Ответ 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 будет иметь некоторые дополнительные значащие цифры и, следовательно, будет сравнивать не равные.