2013-07-05 4 views
3

Возьмите этот код, например:Почему Python возвращает оператор False, если он не должен?

print 2.0 == 2 #---> returns True 

print 12 % 5 #---> returns 2 
print ((12.0/5) - (12/5)) * 5 #---> returns 2.0 

print ((12.0/5) - (12/5)) * 5 == 12 % 5 #---> returns False (What the hell happens here?) 
+0

'((12.0/5) - (12/5)) * 5' не' 2.0' –

+5

[Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com /cd/E19957-01/806-3568/ncg_goldberg.html) – Bakuriu

+0

Кроме того, это отличается между Python 2 и 3. Python2: '((12.0/5) - (12/5)) * 5 = 1.9999999999999996', Python3: '((12.0/5) - (12/5)) * 5 = 0.0' –

ответ

11

Поскольку первый расчет не возвращает точно 2.0:

>>> ((12.0/5) - (12/5)) * 5 
1.9999999999999996 

print пределы дисплея с плавающей точкой только 12 значащих цифр, в результате чего значение будет округлен до 2.0.

+0

Это объясняет это. Благодарю. – Deneb

0

@Bakuriu получил длинный ответ в комментарии для вас.

Короче говоря, совсем не так, чтобы проводить сравнение равенства чисел с плавающей запятой. Всегда выбирайте соответствующее значение эпсилона (диапазон ошибок), чтобы убедиться, что разница между желаемым целым числом и рассчитанными результатами находится в пределах допустимого диапазона ошибок.

Допустим, вы установите eps = 1e-5 (ошибка в пределах +/- 0,00001)

Затем вы можете сделать

print abs(((12.0/5) - (12/5)) * 5 - 12 % 5) < eps

Примечание: Вы можете также сделать < =, зависит от ваших точных потребностей.

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