development

파이썬에서 숫자를 어떻게 반올림합니까?

big-blog 2020. 2. 19. 22:04
반응형

파이썬에서 숫자를 어떻게 반올림합니까?


이 문제는 나를 죽이고있다. 파이썬에서 하나의 숫자를 어떻게 올립니까?

나는 round (number)를 시도했지만 숫자를 내림합니다. 예:

round(2.3) = 2.0 and not 3, what I would like

나는 int (number + .5)를 시도했지만 숫자를 다시 내림합니다! 예:

int(2.3 + .5) = 2

그런 다음 round (number + .5)를 시도했지만 가장자리 경우에는 작동하지 않습니다. 예:

WAIT! THIS WORKED!

조언 부탁드립니다.


CEIL (천장) 기능 :

import math
print(math.ceil(4.2))

염두에 두어야 할 흥미로운 Python 2.x 문제 :

>>> import math
>>> math.ceil(4500/1000)
4.0
>>> math.ceil(4500/1000.0)
5.0

문제는 파이썬에서 두 개의 정수를 나누면 또 다른 정수가 생성되고 상한 호출 전에 잘립니다. 올바른 결과를 얻으려면 하나의 값을 부동 (또는 캐스트)으로 만들어야합니다.

자바 스크립트에서 정확히 동일한 코드는 다른 결과를 생성합니다.

console.log(Math.ceil(4500/1000));
5

나는이 답변이 옛날부터 질문에 대한 것이라는 것을 알고 있지만 수학을 가져오고 싶지 않고 그냥 반올림하고 싶다면 이것이 효과적입니다.

>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5

첫 번째 부분은 4가되고 나머지 부분이있는 경우 두 번째 부분은 "참"으로 평가되며, True = 1입니다. False = 0. 따라서 나머지가 없으면 동일한 정수를 유지하지만 나머지가 있으면 1을 더합니다.


정수로 작업하는 경우 반올림하는 한 가지 방법은 반올림한다는 사실을 이용하는 것입니다 //. 음수로 나누고 답을 부정하십시오. 가져 오기, 부동 소수점 또는 조건부 필요가 없습니다.

rounded_up = -(-numerator // denominator)

예를 들면 다음과 같습니다.

>>> print(-(-101 // 5))
21

numpy를 좋아할 수도 있습니다.

>>> import numpy as np
>>> np.ceil(2.3)
3.0

수학보다 낫다는 말은 아니지만 이미 다른 목적으로 numpy를 사용하고 있다면 코드 일관성을 유지할 수 있습니다.

어쨌든, 내가 만난 세부 사항. 나는 numpy를 많이 사용하고 언급되지 않은 것에 놀랐지 만 물론 받아 들인 대답은 완벽하게 작동합니다.


math.ceil반올림에 사용 :

>>> import math
>>> math.ceil(5.4)
6.0

참고 : 입력은 부동이어야합니다.

정수가 필요하면 호출 int하여 변환하십시오.

>>> int(math.ceil(5.4))
6

BTW, 사용 math.floor라운드에 다운round가장 가까운 정수로 라운드.

>>> math.floor(4.4), math.floor(4.5), math.floor(5.4), math.floor(5.5)
(4.0, 4.0, 5.0, 5.0)
>>> round(4.4), round(4.5), round(5.4), round(5.5)
(4.0, 5.0, 5.0, 6.0)
>>> math.ceil(4.4), math.ceil(4.5), math.ceil(5.4), math.ceil(5.5)
(5.0, 5.0, 6.0, 6.0)

문법은 파이썬처럼 마음에 들지 않지만 강력한 라이브러리입니다.

https://docs.python.org/2/library/decimal.html

from decimal import *
print(int(Decimal(2.3).quantize(Decimal('1.'), rounding=ROUND_UP)))

아무도 제안하지 않은 것에 놀랐습니다

(numerator + denominator - 1) // denominator

반올림하여 정수 나누기. C / C ++ / CUDA의 일반적인 방법으로 사용됨 (참조. divup)


반올림 된 값은 부동이어야합니다

a = 8 
b = 21
print math.ceil(a / b)
>>> 0

그러나

print math.ceil(float(a) / b)
>>> 1.0

이 시도:

a = 211.0
print(int(a) + ((int(a) - a) != 0))

위의 답변은 정확하지만 math이 함수에 대해서만 모듈을 가져 오는 것은 일반적으로 약간의 잔인한 느낌입니다. 운 좋게도 다른 방법이 있습니다.

g = 7/5
g = int(g) + (not g.is_integer())

TrueFalse로 해석됩니다 10파이썬의 숫자를 포함 성명에서. g.is_interger()기본적으로 g.has_no_decimal()또는로 번역됩니다 g == int(g). 영어의 마지막 문장은 다음과 같습니다 round g down and add one if g has decimal.


// 기본 환경을 사용하여 수학을 가져 오지 않고 :

a) 방법 / 클래스 방법

def ceil(fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

def ceil(self, fl): 
  return int(fl) + (1 if fl-int(fl) else 0)

b) 람다 :

ceil = lambda fl:int(fl)+(1 if fl-int(fl) else 0)

>>> def roundup(number):
...     return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20

이 기능은 모듈이 필요하지 않습니다.


반올림하고 a / b정수를 얻으 려는 사람들을 위해 :

정수 나누기를 사용하는 또 다른 변형은

def int_ceil(a, b):
    return (a - 1) // b + 1

>>> int_ceil(19, 5)
4
>>> int_ceil(20, 5)
4
>>> int_ceil(21, 5)
5

이 답변을 아직 보지 못해서 놀랐 round(x + 0.4999)습니다. 이것은 모든 Python 버전에서 작동합니다. 파이썬 반올림 체계가 변경되어 상황이 어려워졌습니다. 게시물을 참조하십시오 .

가져 오기없이 다음을 사용합니다.

def roundUp(num):
    return round(num + 0.49)

testCases = list(x*0.1 for x in range(0, 50))

print(testCases)
for test in testCases:
    print("{:5.2f}  -> {:5.2f}".format(test, roundUp(test)))

왜 이것이 작동 하는가

문서에서

round ()를 지원하는 내장 유형의 경우, 값은 10의 거듭 제곱 n에 가장 가까운 배수로 반올림됩니다. 두 배수가 동일하게 가까운 경우 고른 선택을 향해 반올림됩니다.

따라서 2.5는 2로 반올림되고 3.5는 4로 반올림됩니다. 그렇지 않은 경우 0.5를 추가하여 반올림을 수행 할 수 있지만 중간 지점에 도달하는 것을 피하고 싶습니다. 따라서 0.4999를 더하면 더 가까워 지지만 여백이 반올림되어 정상적으로 예상됩니다. 물론,이 x + 0.4999같으면 실패 [n].5000하지만, 그렇지 않습니다.


가져 오기없이 수행하려면 :

>>> round_up = lambda num: int(num + 1) if int(num) != num else int(num)
>>> round_up(2.0)
2
>>> round_up(2.1)
3

나는 이것이 꽤 오래 전이라는 것을 알고 있지만 꽤 흥미로운 답변을 찾았으므로 여기에 간다.

-round(-x-0.5)

이것은 대소 문자를 수정하고 양수와 음수 모두에서 작동하며 함수 가져 오기가 필요하지 않습니다.

건배


파이썬에서 4500/1000을 작동하면 결과는 4가됩니다. 기본 파이썬은 정수로 결과를 논리적으로 가정합니다.

4500 / 1000.0을 사용하면 결과는 4.5이고 ceil은 4.5-> 5입니다.

javascript를 사용하면 4500/1000의 결과로 4.5를받을 수 있습니다. javascript는 결과 만 "숫자 유형"으로 가정하고 결과를 float로 직접 리턴하기 때문입니다.

행운을 빕니다!!


아무것도 가져오고 싶지 않으면 언제든지 다음과 같이 간단한 함수를 작성할 수 있습니다.

def RoundUP(num): if num== int(num): return num return int(num + 1)


평면도를 사용하여 1을 추가 할 수 있습니다. 2.3 // 2 + 1


int()사이의 작동 메커니즘을 혼동하고 있다고 생각합니다 round().

int()부동 숫자가 제공되면 항상 10 진수를 자릅니다. 반면 round(),시 2.523행 동일한 거리에 모두 2.5그 이상 떨어진 지점에서 0 중 파이썬 복귀.

round(2.5) = 3
int(2.5) = 2

내 몫

print(-(-101 // 5)) = 21위의 예제를 테스트했습니다 .

반올림 :

101 * 19% = 19.19

나는 사용할 수 없으므로 **곱하기를 나누기로 나눕니다.

(-(-101 //(1/0.19))) = 20

https://docs.python.org/2/library/math.html math.ceil을 찾으십시오

"x의 천장을 x보다 크거나 같은 가장 작은 정수 값인 부동 소수점으로 반환합니다."


나는 기본적으로 Python의 초보자이지만, 대신에 반올림하려고하는 이유는 무엇입니까?

round(integer) + 1

참고 URL : https://stackoverflow.com/questions/2356501/how-do-you-round-up-a-number-in-python



반응형