Он округляется до 5.0
перед вызовом math.floor
.
>>> 4.9999999999999999 == 5.0
True
>>> import math
>>> math.floor(5.0)
5.0
Один из способов добиться правильного поведения - использовать Decimal
(а не использовать float
или math
вообще ):
>>> import decimal
>>> int(decimal.Decimal('4.99999999999999999999999999999999999999999999999999999999999999999999999'
).to_integral(rounding=decimal.ROUND_DOWN))
4
FYI Тип Python float
- это IEEE 754 64-битное число с плавающей запятой , поэтому он может иметь (максимум) 2 ** 64 различных значения. Десятичная константа 4.9999999999999999 не может быть представлена точно, поэтому она округляется до некоторого другого значения (которое оказывается точным представлением 5.0), когда Python анализирует исходный код. Без кавычек перед преобразованием в десятичное число число с плавающей запятой округляется:
>>> import decimal
>>> decimal.Decimal(4.9999999999999999)
Decimal('5')
>>> decimal.Decimal('4.9999999999999999')
Decimal('4.9999999999999999')