Я узнал об //
операторе в Python, который в Python 3 делает разделение с полом.
Есть ли вместо этого оператор деления на ceil? (Я знаю об /
операторе, который в Python 3 выполняет деление с плавающей запятой.)
python
python-3.x
Cradam
источник
источник
Ответы:
Нет оператора деления с ceil. Вам нужно
import math
и использоватьmath.ceil
источник
Можно просто сделать перевернутое деление этажа:
Это работает, потому что оператор деления Python выполняет деление пола (в отличие от C, где целочисленное деление усекает дробную часть).
Это также работает с большими целыми числами Python, потому что здесь нет преобразования с плавающей запятой (с потерями).
Вот демонстрация:
источник
int
нет (ну, никаких значимых; на 64-битном Python вы ограничены30 * (2**63 - 1)
битовыми числами), и даже временное преобразование вfloat
может потерять информацию. Сравнитеmath.ceil((1 << 128) / 10)
с-(-(1 << 128) // 10)
.Вы могли бы сделать
(x + (d-1)) // d
при деленииx
наd
, то есть(x + 4) // 5
.источник
math.ceil()
.sys.float_info.max
, и не требует импорта.Решение 1. Преобразуйте пол в потолок с отрицанием
Напоминающий трюк с левитацией Пенна и Теллера , это «переворачивает мир вверх дном (с отрицанием), использует простое деление пола (где потолок и пол поменяны местами), а затем переворачивает мир правой стороной вверх (снова с отрицанием) "
Решение 2. Позвольте divmod () сделать всю работу
Функция divmod () дает
(a // b, a % b)
для целых чисел (это может быть менее надежным с числами с плавающей запятой из-за ошибки округления). Шаг сbool(r)
добавляет единицу к частному всякий раз, когда есть ненулевой остаток.Решение 3. Настройте числитель перед делением
Переместите числитель вверх, чтобы разделение пола округлялось до предполагаемого потолка. Обратите внимание, это работает только для целых чисел.
Решение 4. Преобразование в числа с плавающей запятой для использования math.ceil ()
Код math.ceil () прост для понимания, но он преобразует целые числа в числа с плавающей запятой и обратно. Это не очень быстро и может иметь проблемы с округлением. Кроме того, он опирается на семантику Python 3, где «истинное деление» производит число с плавающей запятой, а функция ceil () возвращает целое число.
источник
-(-a // b)
o_O-(a // -b)
это быстрее, чем-(-a // b)
, по крайней мере, при выборе времени игрушечных примеров сpython -m timeit ...
Вы всегда можете просто сделать это встроенным
В python3 это всего лишь на порядок быстрее, чем принудительное деление с плавающей запятой и вызов ceil (), при условии, что вы заботитесь о скорости. Чего вам не следует делать, если вы не доказали на практике, что вам это нужно.
источник
number=100000000
). За один звонок разница незначительная.foo = -8
иbar = -4
, например, ответ должен быть 2, а не 3, как-8 // -4
. Разделение полов в Python определяется как «математическое деление с применением функции« пол »к результату», а деление потолка - это то же самое, ноceil()
вместоfloor()
.Обратите внимание, что math.ceil ограничен 53 битами точности. Если вы работаете с большими целыми числами, вы можете не получить точных результатов.
Библиотека gmpy2 предоставляет
c_div
функцию, которая использует округление потолка.Отказ от ответственности: я поддерживаю gmpy2.
источник
python2 -c 'from math import ceil;assert ceil(11520000000000000102.9)==11520000000000000000'
(а также заменяющиеpython3
) ОБЕИTrue
Простое решение: a // b + 1
источник