Почему в python math.floor (4.9999999999999999) == 5? - PullRequest
3 голосов
/ 30 мая 2020

Я знаю, что это какая-то ошибка с плавающей запятой, но я читал, что python имеет бесконечную точность, поэтому такого не должно происходить.

Автономный исполняемый код:

import math
math.floor(4.9999999999999999)

1 Ответ

11 голосов
/ 30 мая 2020

Он округляется до 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')
...