Для этих строк кода я возвращаю 0 в качестве вывода, который все они равны друг другу. Теперь, если я правильно понимаю, ab и c могут хранить несколько разные версии истинного значения .3 поэтому, когда Float.compare (...) против этих значений, я ожидаю получить в качестве вывода значение, отличное от 0. Почему я получаю их как 0?Арифметика с плавающей точкой и сравнение значений с плавающей запятой
float a = 0.15f + 0.15f;
float b = 0.1f + 0.2f;
float c = 0.3f;
System.out.println(Float.compare(a, b)); //<--- outputs 0
System.out.println(Float.compare(a, c)); //<--- outputs 0
System.out.println(Float.compare(b, c)); //<--- outputs 0
Просто потому, что с плавающей точкой не является достаточно точным в целом не означает, что она не является достаточно точным в каждом конкретном случае. –
Вы можете добавить к вашему вопросу, что для значений 'double' это не работает (вы получаете' -1', '0',' 1', потому что результат '0.1d + 0.2d' равен' 0.30000000000000004', где другие цифры - '0,3'). – Pshemo
@Pshemo: '0.1d' является таким же неточным, как' 0.1f', только с более десятичными знаками. Никакая точность с плавающей запятой не может представлять 0,1, это повторяющаяся серия в базе-2. –