Как округлить число ВВЕРХ?
Как округлить число ВВЕРХ в Python?
Я пытался использовать round(number)
, но это округляет число вниз. Вот пример:
round(2.3) = 2.0
А мне нужно, чтобы оно округлялось до 3, как я хотел.
Затем я попробовал int(number + .5)
, но оно снова округляет число вниз! Пример:
int(2.3 + .5) = 2
5 ответ(ов)
Я знаю, что этот ответ относится к вопросу, заданному некоторое время назад, но если вы не хотите импортировать модуль math
и просто хотите округлить вверх, это решение работает для меня.
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
В первой части мы получаем 4, а во второй части проверяется, есть ли остаток от деления. Если он есть, то выражение 21 % 5 > 0
вернет True
, что в числовом выражении равно 1; если остатка нет — вернет False
, что равно 0. Таким образом, если остатка нет, число останется прежним, а если остаток есть — прибавится 1.
В случае работы с целыми числами один из способов округления вверх — воспользоваться тем, что оператор //
округляет вниз. Просто выполните деление на отрицательном числе, а затем возьмите отрицательное значение результата. Это не требует импортов, использования чисел с плавающей точкой или условных операторов.
Пример кода:
rounded_up = -(-numerator // denominator)
Например:
>>> print(-(-101 // 5))
21
В этом примере мы сначала делим -101
на 5
, что дает -21
, а затем берем отрицательное значение, получая 21
, что является округленным вверх значением.
Это действительно интересная проблема, связанная с делением в 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.
Вы также можете попробовать использовать numpy:
>>> import numpy as np
>>> np.ceil(2.3)
3.0
Я не утверждаю, что это лучше, чем math
, но если вы уже используете numpy для других задач, это поможет сохранить единообразие в вашем коде.
В любом случае, это просто небольшая деталь, на которую я наткнулся. Я много работаю с numpy и был удивлен, что он не был упомянут, но, конечно, предложенное решение отлично подходит.
Я удивлён, что никто не предложил
(numerator + denominator - 1) // denominator
для целочисленного деления с округлением вверх. Это был распространённый способ в C/C++/CUDA (сравните с divup
).
Как преобразовать строку в float или int?
Максимальные и минимальные значения для целых чисел (ints)
Как использовать десятичное значение шага в range()?
Проверка, является ли переменная целым числом
Преобразование всех строк в списке в целые числа