Я пытался округлить длинные числа типа:
32.268907563;
32.268907563;
31.2396694215;
33.6206896552;
...
Пока безуспешно. Я попытался math.ceil(x)
, math.floor(x)
(хотя это округло бы вверх или вниз, что не то, что я ищу), и round(x)
которое также не работало (все еще числа с плавающей запятой).
Что я мог сделать?
РЕДАКТИРОВАТЬ: КОД:
for i in widthRange:
for j in heightRange:
r, g, b = rgb_im.getpixel((i, j))
h, s, v = colorsys.rgb_to_hsv(r/255.0, g/255.0, b/255.0)
h = h * 360
int(round(h))
print(h)
int(x)
Ответы:
Округлит его и изменит его на целое
РЕДАКТИРОВАТЬ:
Вы не присваиваете int (round (h)) какой-либо переменной. Когда вы вызываете int (round (h)), он возвращает целое число, но больше ничего не делает; Вы должны изменить эту строку для:
Чтобы присвоить новое значение h
РЕДАКТИРОВАТЬ 2:
Как сказал @plowman в комментариях, Python
round()
не работает так, как обычно ожидают, и это потому, что способ хранения числа в качестве переменной обычно не тот, который вы видите на экране. Есть много ответов, объясняющих это поведение:round (), кажется, не округляется должным образом
Один из способов избежать этой проблемы - использовать десятичное число, как указано в этом ответе: https://stackoverflow.com/a/15398691/4345659
Для правильной работы этого ответа без использования дополнительных библиотек было бы удобно использовать пользовательскую функцию округления. После многих исправлений я пришел к следующему решению, которое, насколько я тестировал, позволило избежать всех проблем с хранением. Он основан на использовании строкового представления, полученного с помощью
repr()
(НЕstr()
!). Это выглядит неприлично, но это был единственный способ, который я нашел, чтобы решить все дела. Работает как с Python2, так и с Python3.тесты:
Наконец, исправленный ответ будет следующим:
РЕДАКТИРОВАТЬ 3:
тесты:
Здесь есть то, что
dec
десятаяdec+1
цифра может быть 9, а если десятая цифра> = 5, то 9 станет 0, а 1 должна быть перенесена вdec-1
третью цифру.Если мы примем это во внимание, мы получим:
В описанной выше ситуации
b = 10
и предыдущей версией бы просто конкатенации ,a
иb
что привело бы к конкатенации ,10
где задн 0 исчезнет. Эта версия преобразуетсяb
в правильное десятичное место на основеdec
, как правильный перенос.источник
int(round(4.5))
округляется до 4 , аint(round(4.500001))
правильно округляется до 5.round(x)
достаточно в Python 3.6.2 (и, возможно, также в более низких версиях). Результат уже имеет тип int. Примечание:round(x, n)
будет иметь тип float.использование
round(x, y)
. Он будет округлять ваш номер до желаемого десятичного знака.Например:
источник
round(value,significantDigit)
это обычное решение, однако это не работает так, как можно было бы ожидать с математической точки зрения, когда значения округляются до5
. Если значение5
находится в цифре сразу после того, к которому вы округлили, эти значения только иногда округляются, как ожидалось (т.е.8.005
округление до двух десятичных цифр дает8.01
). Для определенных значений из-за особенностей математики с плавающей запятой они округляются вместо этого!т.е.
Weird.
Предполагая, что вы намереваетесь сделать традиционное округление для статистики в науке, это удобная оболочка, чтобы заставить
round
функцию работать так, как ожидалось, и требуетimport
дополнительных вещей, таких какDecimal
.Ага! На основании этого мы можем сделать функцию ...
По сути, это добавляет значение, которое гарантированно будет меньше, чем наименее заданная цифра строки, на которой вы пытаетесь использовать
round
. Добавляя это небольшое количество, оноround
в большинстве случаев сохраняет поведение, в то же время теперь проверяя, округляет ли цифра меньше, чем округляемая,5
и округляет ли она4
.Подход использования
10**(-len(val)-1)
был преднамеренным, так как это наибольшее небольшое число, которое вы можете добавить, чтобы форсировать сдвиг, при этом гарантируя, что добавляемое вами значение никогда не изменит округление, даже если десятичное число.
отсутствует. Я мог бы использовать только10**(-len(val))
с условным условием,if (val>1)
чтобы вычесть1
больше ... но проще всегда всегда вычитать,1
поскольку это не сильно изменит применимый диапазон десятичных чисел, который этот обходной путь может правильно обработать. Этот подход потерпит неудачу, если ваши значения достигнут пределов типа, это не удастся, но почти для всего диапазона допустимых десятичных значений это должно работать.Вы также можете использовать десятичную библиотеку для достижения этой цели, но предложенная мной оболочка проще и может быть предпочтительнее в некоторых случаях.
Изменить: Спасибо Blckknght за указание, что
5
крайний случай происходит только для определенных значений. Также более ранняя версия этого ответа не была достаточно явной, так что странное поведение округления происходит только тогда, когда цифра, непосредственно уступающая цифре, к которой вы округляете, имеет5
.источник
5
последней цифрой всегда будут округляться. Это не тот случай в быстром тесте я просто с числами , как1.5
,2.5
,3.5
и так далее , и1.05
,1.15
,1.25
,1.35
округление до одного знака после запятой. Первый набор (точные половинки округляются до маленьких целых) всегда округляется до четного целого числа. Последний набор не округляется последовательно, вероятно, из-за неточных двоичных представлений некоторых значений. Поплавки, которые имеют точные двоичные представления, такие как1.25
округление, имеют даже наименее значащую цифру, но остальные, кажется, округляются случайным образом.round(4.0005,3)
дает4.0
иround(1.0005,3)
дает1.0
, ноround(2.0005,3)
дает2.001
иround(3.0005,3)
дает3.001
. Но именно поэтому мое предложенное решение необходимо ... вы не знаете, чего ожидать от раунда акций, в этом важном случае!, digits
в конце этого оператора возврата? Не каламбур предназначен. ( Средний я имею в виду)Для позитива попробуйте
Чтобы это работало и на негативы, попробуйте
int()
работает как функция пола и, следовательно, вы можете использовать это свойство. Это определенно самый быстрый способ.источник
>>> x=-0.999
>>> int(x), round(x), int(x+0.5)
(0, -1.0, 0)
Разве Python не выполняет круглый раунд , как это предписано IEEE 754 ?
Будьте осторожны, переопределяя или используя «нестандартные» округления ...
(См. Также https://stackoverflow.com/a/33019948/109839 )
источник
Round half to even
абсолютно не предписывается IEEE 754, но вместо этого является лишь одним из нескольких вариантов округления, описанных в стандарте .Round to nearest, ties away from zero
(то есть поведение, ожидаемое большинством людей) также является опцией и используется по умолчанию, например, в C / C ++.round
объясняется) и делает это в соответствии со способом, предписанным «округлить с половины до четного» работать (или описывать) по стандарту.Вы также можете использовать numpy, если вы используете python3.x, вот пример
источник
Ваше решение обзванивает без указания второго аргумента (количество десятичных знаков)
что намного лучший результат, чем
Из документации Python по адресу https://docs.python.org/3/library/functions.html#round
источник
Если вам нужно (например) двухзначное приближение для A, то
int(A*100+0.5)/100.0
будете делать то, что ищете.Если вам нужно трехзначное приближение, умножьте и разделите на 1000 и так далее.
источник
Нечто подобное должно также работать
источник
Для этого я бы предложил сделать следующее:
Это даст вам ближайшее целое число.
Надеюсь это поможет!!
источник
Я использую и могу посоветовать следующее решение (python3.6):
Он отлично работает для половинных чисел (положительных и отрицательных) и работает даже быстрее, чем int (round (x)):
источник