2014-01-26 3 views
0

Я стараюсь тренироваться для scjp.двойной сравнение. объяснение разных результатов

У меня есть этот код:

System.out.println(0.8==0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1);//false 
System.out.println(0.8==((0.1+0.1)+(0.1+0.1))+((0.1+0.1)+(0.1+0.1))); // true 

выход:

true 
false 

Я знаю, что верно сравнение что-то вроде этого:

abs(a1-a2)<epsilon 

Но это приводит странно для меня. Кто может объяснить их для меня?

Действительно ли аналогичные вопросы для scjp?

ответ

1

В Java двойные значения представляют собой номера с плавающей точкой IEEE. Если они не являются степенью 2 (или суммой степеней 2, например 1/8 + 1/4 = 3/8), они не могут быть представлены точно, даже если они имеют высокую точность. Некоторые операции с плавающей запятой объединяют ошибку округления, присутствующую в этих числах с плавающей запятой. В случаях, которые вы описали выше: Сумма 0,1 + 0,1 .... 8 раз получается результат 0,7999999999999999, тогда как во второй сумме результат 0,8 тыс. У, это результат true.

+0

Как вы думаете, можно ли предсказать без выполнения программы? – gstackoverflow

+0

@gstackoverflow его невозможно без выполнения, чтобы предсказать результат. – Kick

Смежные вопросы