Как округлить числа в Python
Я пытаюсь округлить целые числа в python. Я посмотрел на встроенную функцию round (), но кажется, что раунды плавают.
моя цель-круглые числа до ближайшего кратного 10. т. е.: 5-> 10, 4-> 0, 95->100, и т. д.
5 и выше должны округлить вверх, 4 и ниже должны округлить вниз.
Это код у меня есть, что это:
def round_int(x):
last_dig = int(str(x)[-1])
if last_dig >= 5:
x += 10
return (x/10) * 10
Это лучший способ, чтобы достичь того, чего я хочу достичь? Есть ли встроенная функция что это? Кроме того, если это лучший способ, что-то не так с кодом, который я пропустил в тестировании?
7 ответов:
на самом деле, вы все еще можете использовать функции Round:
>>> print round(1123.456789, -1) 1120.0Это округление до ближайшего кратного 10. До 100 будет -2 в качестве второго аргумента и так далее.
round () может принимать ints и отрицательные числа для мест, которые округляются слева от десятичного знака. Возвращаемое значение по-прежнему является плавающим, но простое приведение исправляет это:
>>> int(round(5678,-1)) 5680 >>> int(round(5678,-2)) 5700 >>> int(round(5678,-3)) 6000
о
round(..)функция, возвращающая floatчто float (двойная точность в Python) всегда является идеальным представлением целого числа, пока оно находится в диапазоне [-253..253]. (Педанты обращают внимание: это не дополнение двух в двойниках, поэтому диапазон симметричен относительно нуля.)
посмотреть здесь для сведения.
Если вы хотите, чтобы algebric форме и по-прежнему использовать круглые для его трудно получить проще, чем:
interval = 5 n = 4 print(round(n/interval))*interval
эта функция округляется либо на порядок (справа налево), либо по цифрам так же, как формат обрабатывает десятичные знаки с плавающей запятой (слева направо:
def intround(n, p): ''' rounds an intger. if "p"<0, p is a exponent of 10; if p>0, left to right digits ''' if p==0: return n if p>0: ln=len(str(n)) p=p-ln+1 if n<0 else p-ln return (n + 5 * 10**(-p-1)) // 10**-p * 10**-p >>> tgt=5555555 >>> d=2 >>> print('\t{} rounded to {} places:\n\t{} right to left \n\t{} left to right'.format( tgt,d,intround(tgt,-d), intround(tgt,d)))печать
5555555 rounded to 2 places: 5555600 right to left 5600000 left to rightвы также можете использовать класс десятичные:
import decimal import sys def ri(i, prec=6): ic=long if sys.version_info.major<3 else int with decimal.localcontext() as lct: if prec>0: lct.prec=prec else: lct.prec=len(str(decimal.Decimal(i)))+prec n=ic(decimal.Decimal(i)+decimal.Decimal('0')) return nна Python 3 Вы можете надежно использовать раунд с отрицательными местами и получить округленное целое число:
def intround2(n, p): ''' will fail with larger floating point numbers on Py2 and require a cast to an int ''' if p>0: return round(n, p-len(str(n))+1) else: return round(n, p)на Python 2 round не сможет вернуть правильное целое число округления на больших числах, потому что раунд всегда возвращает поплавок:
>>> round(2**34, -5) 17179900000.0 # OK >>> round(2**64, -5) 1.84467440737096e+19 # wrongостальные 2 функции работают на Python 2 и 3
Я хотел сделать то же самое, но с 5 вместо 10, и придумал простую функцию. Надеюсь, что это полезно:
def roundToFive(num): remaining = num % 5 if remaining in range(0, 3): return num - remaining return num + (5 - remaining)
Comments