파이썬에서 정수를 반올림하는 방법
나는 파이썬 라운드 정수로 노력하고 있습니다. 내장 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
이것이 내가 달성하고자하는 것을 달성하는 가장 좋은 방법입니까? 이를 수행하는 내장 함수가 있습니까? 또한 이것이 최선의 방법이라면 테스트에서 놓친 코드에 문제가 있습니까?
사실, 여전히 round 함수를 사용할 수 있습니다.
>>> print round(1123.456789, -1)
1120.0
이것은 10의 가장 가까운 배수로 반올림됩니다. 100까지 두 번째 인수로 -2가됩니다.
round ()는 소수점 왼쪽으로 반올림되는 자리에 대해 정수와 음수를 사용할 수 있습니다. 반환 값은 여전히 부동 소수점이지만 간단한 캐스트는 다음을 수정합니다.
>>> int(round(5678,-1))
5680
>>> int(round(5678,-2))
5700
>>> int(round(5678,-3))
6000
약간 더 간단합니다.
def round_int(x):
return 10 * ((x + 5) // 10)
round(..)
float를 반환하는 함수 정보
부동 소수점 (파이썬에서는 배정 밀도)은 [-2 53 ..2 53 ] 범위에있는 한 항상 정수의 완벽한 표현입니다 . (Pedants주의 : 복식에서 2의 보수가 아니므로 범위는 0에 대해 대칭입니다.)
나는 똑같은 일을하고 싶었지만 10 대신 5로 간단한 기능을 생각 해냈다. 유용하기를 바랍니다.
def roundToFive(num):
remaining = num % 5
if remaining in range(0, 3):
return num - remaining
return num + (5 - remaining)
algebric 형태를 원하고 여전히 round를 사용한다면 다음보다 간단 해지기가 어렵습니다.
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
Decimal 클래스를 사용할 수도 있습니다.
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
파이썬 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가 항상 float를 반환하기 때문에 round가 큰 숫자에 대해 적절한 반올림 정수를 반환하지 못합니다.
>>> round(2**34, -5)
17179900000.0 # OK
>>> round(2**64, -5)
1.84467440737096e+19 # wrong
다른 2 개의 함수는 Python 2 및 3에서 작동합니다.
참고 URL : https://stackoverflow.com/questions/3348825/how-to-round-integers-in-python
'Development Tip' 카테고리의 다른 글
Java 맵 항목 업데이트 (0) | 2020.11.03 |
---|---|
Perl : if (목록의 요소) (0) | 2020.11.03 |
@ Html.DropDownList ()를 사용하여 선택할 CSS 클래스 추가 (0) | 2020.11.03 |
git에서 커밋 한 후 자동으로 푸시하는 방법은 무엇입니까? (0) | 2020.11.03 |
Angularjs 필터가 null이 아닙니다. (0) | 2020.11.03 |