2014-01-25 2 views
2

Для этих строк кода я возвращаю 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 
+1

Просто потому, что с плавающей точкой не является достаточно точным в целом не означает, что она не является достаточно точным в каждом конкретном случае. –

+2

Вы можете добавить к вашему вопросу, что для значений 'double' это не работает (вы получаете' -1', '0',' 1', потому что результат '0.1d + 0.2d' равен' 0.30000000000000004', где другие цифры - '0,3'). – Pshemo

+0

@Pshemo: '0.1d' является таким же неточным, как' 0.1f', только с более десятичными знаками. Никакая точность с плавающей запятой не может представлять 0,1, это повторяющаяся серия в базе-2. –

ответ

1

Потому что, как вы говорите, они могут магазин немного разные версии. Но с этими простыми выражениями нет потери точности, поэтому a, b и c содержат точно такую ​​же версию .3f.

Для удовольствия попробуйте это. Здесь вы потеряете точность, и результат сравнения не будет 0:

public static void main(String[] args) { 
    float a = .3f; 
    float b = .3f; 
    a = (float) Math.cos(a); 
    a = (float) Math.acos(a); 
    System.out.println(Float.compare(a, b)); 
} 
Смежные вопросы