Почему оператор if в моем коде python не проверяет условие как True и переходит к следующей строке

#python

#python

Вопрос:

 nums=[1,2,3,10]
k=2
d=len(nums)-1
s=sum(nums)/d
for i in nums:
    dif=s-(i/d)
    if dif == k:
        print(True)
print(False)
 

Я ожидаю, что результат будет True, а затем False
Но он печатает только False
В какой-то момент dif = 2 amp; k = 2 все еще Idk, почему он пропускает оператор print (True)

Комментарии:

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

2. Какую отладку вы выполняли? Поставьте точку останова и следуйте коду и посмотрите, почему то, что вы ожидаете, не происходит…

Ответ №1:

Проблема заключается в операторе деления «/». В python по умолчанию используется деление с плавающей запятой. Из-за ошибки с плавающей запятой вы получаете небольшую разницу, из-за которой значения, которые вы ожидаете, будут равны, а не равны.

Я изменил ваш код на следующий:

 nums=[1,2,3,10]
k=2
d=len(nums)-1
s=sum(nums)/d
for i in nums:
    dif = s-(i/d)
    print(dif, k, dif == k)
 

Вывод

 5.0 2 False
4.666666666666666 2 False
4.333333333333333 2 False
1.9999999999999996 2 False
 

Как вы видите для i == 10, вы сравниваете число с плавающей запятой 1.9999999999999996 с целым числом 2.

Вы можете либо преобразовать число с плавающей запятой в целое число, например, используя округление, либо сравнить их как числа с плавающей запятой, что более сложно. (например. https://floating-point-gui.de/errors/comparison /)

Комментарии:

1. Что касается рекомендации по приведению к целому числу, обратите внимание, что int(1.9999999999999996) == 1

2. @Passerby Спасибо, я отредактировал ответ, чтобы более правильно выразить свое первоначальное намерение.