Вышеупомянутые ответы работают во многих случаях, но они пропускают некоторые. Рассмотрим следующее:
fl = sum([0.1]*10) # this is 0.9999999999999999, but we want to say it IS an int
Используя это в качестве эталона, некоторые из других предложений не получают желаемого поведения:
fl.is_integer() # False
fl % 1 == 0 # False
Вместо этого попробуйте:
def isclose(a, b, rel_tol=1e-09, abs_tol=0.0):
return abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
def is_integer(fl):
return isclose(fl, round(fl))
теперь мы получаем:
is_integer(fl) # True
isclose
поставляется с Python 3.5 + , а для других Python вы можете использовать это в основном эквивалентное определение ( как указано в соответствующем PEP )