Может ли кто-нибудь прояснить разницу между функцией math.floor() и оператором //. Судя по тому, что я читал, они практически делают то же самое. Но я попробовал кое-что, и иногда кажется, что они дают разные результаты. К этому сообщению приложен пример, в котором они выдают разные результаты.
def try_floor():
return math.floor(47642706656219667964201 / 2)
def try_double_backslash():
return 47642706656219667964201 // 2
Это результаты соответственно
23821353328109835780096
23821353328109833982100
Когда ваши числа становятся большими, метод с плавающей запятой не так точен. Например, если вы попробуете a=9007199254740992.0; print (a== a+1)
, вы обнаружите, что он печатает True
Возможный дубликат stackoverflow.com/questions/40777772/…
Извините за это, я не особо разбираюсь в stackoverflow. Хотя спасибо за поправку. Отредактировал вопрос.
@tripleee это не возможный дубликат, это дубликат. Ответ там действительно решает эту проблему.
@ChukwujiobiCanon, почему ты говоришь, что это дубликат? Этот вопрос сосредоточен на производительности между этими двумя. Я хочу знать точную причину, по которой эти двое выдают разные результаты. Возможно, это я не понимаю. Не могли бы вы меня просветить? Спасибо
Производительность здесь не имеет значения. Они примерно эквивалентны, если только целые числа x
или y
не действительно огромны, и в этом случае x / y
, вероятно, будет слишком неправильно использовать, независимо от того, насколько быстро вы сможете его вычислить.
Вам действительно следует задуматься о разнице между операторами /
и //
. Часть floor
здесь менее важна.
Оператор регулярного деления имеет результат с плавающей запятой. Точность чисел с плавающей запятой ограничена; они не могут точно представлять какое-либо число. Даже если результатом является целое число, если оно очень большое, оно будет «усечено» до точности с плавающей запятой. Люди обычно игнорируют это, потому что точности с плавающей запятой обычно достаточно для реальных измерений. Однако в данном случае происходит вот что.
Числа с плавающей запятой имеют точность около 16 десятичных цифр. Если вам нужны точные целочисленные вычисления, используйте целочисленное деление: целые числа не имеют ограничений на количество цифр, и все целые числа могут быть представлены точно. Это то, что происходит в примере с оператором //
.
Один выполняет целочисленные вычисления, другой — вычисления с плавающей запятой, точность которых ограничена.