Эта проблема убивает меня. Как собрать число UP в Python?
Я попытался округлить (число), но оно округлило число вниз. Пример:
round(2.3) = 2.0 and not 3, what I would like
Я попробовал int (число + .5), но он снова округлил число вниз! Пример:
int(2.3 + .5) = 2
Затем я попытался раунд (число + .5), но он не будет работать в крайних случаях. Пример:
WAIT! THIS WORKED!
Пожалуйста, порекомендуйте.
python
floating-point
integer
rounding
python-2.x
bodacydo
источник
источник
round(number + .5)
не работает, если число целое.round(3+.5) == 4
когда ты действительно хочешь3
.Ответы:
CEIL функция (потолок):
источник
int(math.ceil(363))
math.ceil
возвращает фактический целочисленный объект, а не просто плавающий объект с целочисленным значением.10000000 * 0.00136 = 13600.000000000002
ceil может сильноmath.ceil(10000000 * 0.00136) = 13601.0
Я знаю, что это ответ на вопрос из давних времен, но если вы не хотите импортировать математику, и вы просто хотите округлить, это работает для меня.
Первая часть становится 4, а вторая часть оценивается как «True», если есть остаток, который, кроме того, True = 1; False = 0. Таким образом, если нет остатка, то оно остается тем же целым числом, но если есть остаток, оно добавляет 1.
источник
//
для целочисленного деления, так что это становится21 // 5 + (21 % 5 > 0)
.float
с. Ницца.Интересная проблема Python 2.x, о которой следует помнить:
Проблема в том, что при делении двух целых чисел в python получается другое целое число, и оно усекается перед вызовом потолка. Вы должны сделать одно значение плавающим (или приведенным), чтобы получить правильный результат.
В javascript точно такой же код дает другой результат:
источник
При работе с целыми числами один из способов округления состоит в том, чтобы воспользоваться преимуществом факта округления
//
: просто выполните деление на отрицательное число, а затем отрицайте ответ. Не требуется импорт, с плавающей запятой или условно.Например:
источник
(num + den - 1) // den
, что хорошо дляint
входных данных с положительными знаменателями, но завершается неудачей, еслиfloat
задействован хотя бы один нецелый (числитель или знаменатель); это выглядит более волшебно, но работает как дляint
s, так и дляfloat
s. Для небольших числителей это также быстрее (на CPython 3.7.2), хотя странно, когда только числитель достаточно большой, чтобы нужна математика на основе массива, ваш подход медленнее; Непонятно, почему это так, поскольку работа деления должна быть похожей, а два унарных отрицания должны быть дешевле, чем сложение + вычитание.Вам также может понравиться NumPy:
Я не говорю, что это лучше, чем математика, но если вы уже использовали numpy для других целей, вы можете сохранить свой код согласованным.
Так или иначе, только деталь, с которой я столкнулся. Я часто использую NumPy и был удивлен, что об этом не упоминается, но, конечно, принятый ответ работает отлично.
источник
Используйте
math.ceil
для округления:ПРИМЕЧАНИЕ : ввод должен быть плавающим.
Если вам нужно целое число, позвоните,
int
чтобы преобразовать его:Кстати, используйте
math.floor
для округления вниз иround
округления до ближайшего целого числа.источник
ceil()
этом позаботятся внутреннеСинтаксис может быть не таким питоническим, как хотелось бы, но это мощная библиотека.
https://docs.python.org/2/library/decimal.html
источник
Я удивлен, что никто не предложил
для целочисленного деления с округлением в большую сторону. Раньше был обычный способ для C / C ++ / CUDA (ср.
divup
)источник
1
вместо того, чтобы вычитать его, или перевернуть знаки числителя и знаменателя перед выполнением математики.Будьте уверены, округленное значение должно быть плавающим
но
источник
Попробуй это:
источник
((int(a) - a) != 0)
выражение возвращается1
всякий раз , когдаa
должен быть округляется. Вы можете расширить свой ответ и объяснить, как это работает.Эта функция не требует модулей.
источник
3
, то он будет округлен до того,4
что может или не может быть тем, что кто-то хочетПриведенные выше ответы верны, однако импорт
math
модуля только для этой одной функции обычно кажется для меня излишним. К счастью, есть еще один способ сделать это:True
иFalse
интерпретируются как1
и0
в утверждении, включающем числа в Python.g.is_interger()
в основном переводится какg.has_no_decimal()
илиg == int(g)
. Таким образом, последнее утверждение на английском языке читаетround g down and add one if g has decimal
.источник
int(g) + (g % 1 > 0)
вместо этого ;-)from math import ceil
похоже исправляет импорт всего математического модуля :)import math
того, что происходит за кулисами. Он просто удаляет все символы, кромеceil
.Без импорта математики // используя базовые условия:
а) метод / класс метод
б) лямбда:
источник
Для тех, кто хочет округлить
a / b
и получить целое число:Другой вариант с использованием целочисленного деления
источник
В случае, если кто-то хочет округлить до определенного десятичного знака:
источник
Я удивлен, что еще не видел этот ответ
round(x + 0.4999)
, поэтому я собираюсь положить его. Обратите внимание, что это работает с любой версией Python. Изменения, внесенные в схему округления Python, усложнили ситуацию. Смотрите этот пост .Без импорта я использую:
Почему это работает
Из документов
Поэтому 2.5 округляется до 2, а 3.5 округляется до 4. Если этого не произошло, то округление можно было бы сделать, прибавив 0,5, но мы хотим избежать перехода к половине. Таким образом, если вы добавите 0,4999, вы приблизитесь, но с достаточным запасом для округления до того, что вы обычно ожидаете. Конечно, это не удастся, если
x + 0.4999
равно[n].5000
, но это маловероятно.источник
math.ceil()
?Without importing I use:
. Я также упомянул, что он потерпит неудачу, еслиx + 0.4999
равен[n].5000
.math
Модуль иmath.ceil()
находится в стандартной библиотеке, поэтому везде для всех практических целей без установки дополнительных вещей. А что касается вашего упоминания о том, когда оно терпит неудачу, это неполно в вашем ответе, поскольку оно терпит неудачу в течение целого интервала, а не только для одной точки. Технически, вы можете возразить , что вы правы, как вы говорите , если и не тогда и только тогда , но это сделает впечатление на случайного читателя , что это менее вероятно , чем на самом деле.Чтобы сделать это без какого-либо импорта:
источник
Я знаю, что это было довольно давно, но я нашел довольно интересный ответ, так что здесь идет:
Это исправляет случаи ребер и работает как для положительных, так и для отрицательных чисел и не требует импорта каких-либо функций.
ура
источник
-round(-x-0.3) = x
когда вы используете 4500/1000 в python, результатом будет 4, потому что для python по умолчанию в качестве целочисленного значения присваивается логическое значение: 4500/1000 = 4.5 -> int (4.5) = 4, а ceil of 4, очевидно, равен 4
при использовании 4500 / 1000.0 результат будет 4.5, а ceil 4.5 -> 5
Используя javascript, вы получите 4.5 как результат 4500/1000, потому что javascript присваивает только результат как «числовой тип» и возвращает результат непосредственно как float
Удачи!!
источник
/
всегда приводит к плавающей запятой, поэтому4500/1000
всегда 4,5.Если вы не хотите ничего импортировать, вы всегда можете написать свою собственную простую функцию как:
def RoundUP(num): if num== int(num): return num return int(num + 1)
источник
Вы можете использовать разделение пола и добавить 1 к нему. 2.3 // 2 + 1
источник
ceil()
вместо того, чтобы странным образом делать обратное, а затем компенсирующееfrom math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Я думаю, что вы путаете рабочие механизмы между
int()
иround()
.int()
всегда усекает десятичные числа, если задано плавающее число; тогда какround()
в случае,2.5
когда2
и3
оба находятся на одинаковом расстоянии от2.5
, Python возвращает то, что больше от точки 0.источник
2.3
получается3
, что не происходит ни в одном из ваших примеров.Моя доля
Я проверил
print(-(-101 // 5)) = 21
приведенный пример выше.Теперь для округления:
Я не могу использовать,
**
поэтому я распространяю умножение на деление:источник
Я в основном новичок в Python, но если вы просто пытаетесь округлить вверх, а не вниз, почему бы не сделать:
источник
round(integer + 0.5)
Это то, что я часто делаю