8

Как округлить число ВВЕРХ?

37

Как округлить число ВВЕРХ в Python?

Я пытался использовать round(number), но это округляет число вниз. Вот пример:

round(2.3) = 2.0 

А мне нужно, чтобы оно округлялось до 3, как я хотел.

Затем я попробовал int(number + .5), но оно снова округляет число вниз! Пример:

int(2.3 + .5) = 2

5 ответ(ов)

3

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

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

В первой части мы получаем 4, а во второй части проверяется, есть ли остаток от деления. Если он есть, то выражение 21 % 5 > 0 вернет True, что в числовом выражении равно 1; если остатка нет — вернет False, что равно 0. Таким образом, если остатка нет, число останется прежним, а если остаток есть — прибавится 1.

2

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

Пример кода:

rounded_up = -(-numerator // denominator)

Например:

>>> print(-(-101 // 5))
21

В этом примере мы сначала делим -101 на 5, что дает -21, а затем берем отрицательное значение, получая 21, что является округленным вверх значением.

1

Это действительно интересная проблема, связанная с делением в Python 2.x. Давайте разберем ваш пример:

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

В Python 2.x, когда вы делите два целых числа (интов), результатом будет также целое число, а дробная часть будет отброшена (усечена). В первом случае 4500 / 1000 дает 4, и затем math.ceil применяет округление к 4, что и дает результат 4.0.

Но во втором примере, когда вы делите 4500 на 1000.0, Python понимает, что одно из чисел - это число с плавающей точкой (float), и следовательно, результатом будет 4.5. После этого math.ceil округляет 4.5 до 5.0.

В отличие от этого, в JavaScript, деление всегда возвращает значение с плавающей точкой, даже если оба операнда - целые числа. Таким образом, следующий код:

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

возвращает 5, поскольку 4500 / 1000 производит 4.5, и Math.ceil корректно округляет это значение до 5.

Таким образом, чтобы избежать путаницы в Python 2.x, вы должны убедиться, что по крайней мере одно из делимых чисел является числом с плавающей точкой, чтобы получить ожидаемый результат. Например:

result = math.ceil(4500 / 1000.0)  # или math.ceil(4500 / float(1000))

Это знание может помочь вам избежать неожиданных результатов при использовании деления в Python 2.x.

0

Вы также можете попробовать использовать numpy:

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

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

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

0

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

(numerator + denominator - 1) // denominator

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь