Как вы округлите число в Python? - PullRequest
399 голосов
/ 01 марта 2010

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

Пожалуйста, сообщите.

Ответы [ 23 ]

728 голосов
/ 01 марта 2010

Функция ceil (потолок):

import math
print(math.ceil(4.2))
150 голосов
/ 31 октября 2011

Интересная проблема Python 2.x, о которой стоит помнить:

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

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

В javascript точно такой же код дает другой результат:

console.log(Math.ceil(4500/1000));
5
138 голосов
/ 11 мая 2014

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

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

Первая часть становится 4, а вторая часть оценивается как "True", если есть остаток, который, кроме того, True = 1; False = 0. Таким образом, если нет остатка, то остается то же самое целое, но если есть остаток, оно добавляет 1.

82 голосов
/ 01 февраля 2016

При работе с целыми числами одним из способов округления является использование преимущества того, что // округляется: просто выполните деление на отрицательное число, а затем отрицайте ответ. Не требуется импорт, с плавающей запятой или условный.

rounded_up = -(-numerator // denominator)

Например:

>>> print(-(-101 // 5))
21
48 голосов
/ 26 апреля 2013

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

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

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

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

24 голосов
/ 01 марта 2010

Используйте math.ceil для округления:

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

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

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

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

Кстати, используйте 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)
11 голосов
/ 27 марта 2015

Синтаксис может быть не таким питонским, как хотелось бы, но это мощная библиотека.

https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))
9 голосов
/ 08 апреля 2017

Я удивлен, что никто не предложил

(numerator + denominator - 1) // denominator

для целочисленного деления с округлением в большую сторону. Раньше был обычный способ для C / C ++ / CUDA (ср. divup)

7 голосов
/ 21 июня 2018
>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

Эта функция не требует модулей.

7 голосов
/ 30 июля 2014

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

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

но

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