Development Tip

파이썬에서 정수를 반올림하는 방법

yourdevel 2020. 11. 3. 19:21
반응형

파이썬에서 정수를 반올림하는 방법


나는 파이썬 라운드 정수로 노력하고 있습니다. 내장 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

반응형