Как вы обмениваете число в Python?


Answers

Интересная проблема Python 2.x, чтобы иметь в виду:

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

Проблема в том, что разделение двух ints в python создает другой int, и это усекается перед потолочным вызовом. Вы должны сделать одно значение float (или cast), чтобы получить правильный результат.

В javascript тот же самый код производит другой результат:

console.log(Math.ceil(4500/1000));
5
Question

Эта проблема убивает меня. Как один округляет число 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!

Пожалуйста, порекомендуйте.




Я думаю, вы смешиваете рабочие механизмы между int() и round() .

int() всегда усекает десятичные числа, если дано плавающее число; тогда как round() , в случае 2.5 где 2 и 3 находятся на равном расстоянии от 2.5 , Python возвращает то, что больше от 0-го пункта.

round(2.5) = 3
int(2.5) = 2



Вышеприведенные ответы правильны, однако, импортирование math модуля только для этой функции обычно кажется для меня немного излишним. К счастью, есть еще один способ сделать это:

g = 7/5
g = int(g) + (not g.is_integer())

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 .




Вы можете использовать напольное решение и добавить 1 к нему. 2.3 // 2 + 1




Будьте осторожны, округленное значение должно быть плавающим

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

но

print math.ceil(float(a) / b)
>>> 1.0



Я удивлен, что еще не видел ответа на этот вопрос round(x + 0.4999) , поэтому я собираюсь его отложить. Обратите внимание, что это работает с любой версией Python. Изменения, внесенные в схему округления Python, усложнили ситуацию. См. Этот post .

Без импорта я использую:

def roundUp(num):
    return round(num + 0.49)

testCases = list(x*0.1 for x in range(0, 50))

print(testCases)
for test in testCases:
    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))

Почему это работает

Из документов

Для встроенных типов, поддерживающих round (), значения округляются до ближайшего кратного 10 до мощности минус n; если два кратных одинаково близки, округление выполняется в направлении четного выбора

Поэтому 2.5 округляется до 2 и 3.5 округляется до 4. Если это не так, то округление может быть выполнено путем добавления 0,5, но мы хотим избежать попадания на полпути. Итак, если вы добавите 0.4999, вы приблизитесь, но с достаточным запасом, чтобы округлить до того, что вы обычно ожидаете. Конечно, это не удастся, если x + 0.4999 равно [n].5000 , но это маловероятно.




Вам также может понравиться numpy:

>>> import numpy as np
>>> np.ceil(2.3)
3.0

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

Во всяком случае, просто деталь, с которой я столкнулся. Я много использую numpy и был удивлен, что он не упоминается, но, конечно, принятый ответ работает отлично.




когда вы используете 4500/1000 в python, результат будет равен 4, потому что для python по умолчанию, как целочисленный результат, логически: 4500/1000 = 4.5 -> int (4.5) = 4 и ceil of 4 очевидно 4

с использованием 4500 / 1000,0 результат будет 4,5 и 4,5 -> 5

Используя javascript, вы получите 4.5 в результате 4500/1000, потому что javascript использует только результат как «числовой тип» и возвращает результат непосредственно как float

Удачи!!




Чтобы сделать это без какого-либо импорта:

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3



ceil для округления:

>>> import math
>>> math.ceil(5.4)
6.0

ПРИМЕЧАНИЕ . Вход должен быть плавающим.

Если вам нужно целое число, вызовите int чтобы преобразовать его:

>>> int(math.ceil(5.4))
6

BTW, используйте math.floor для округления и round до округления до ближайшего целого.

>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)