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


486

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

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!

조언 부탁드립니다.


4
round(number + .5)숫자가 정수이면 작동하지 않습니다. round(3+.5) == 4당신이 실제로 원할 때 3.
Nearoo

답변:


845

CEIL (천장) 기능 :

import math
print(math.ceil(4.2))

21
정교함 : math.ceil은 입력 값보다 크거나 같은 가장 작은 정수를 반환합니다. 이 함수는 입력을 부동 소수점으로 처리하고 (Python에는 강력한 형식의 변수가 없음) 부동 소수점을 반환합니다. int를 원한다면 반환 값으로 int를 구성 할 수 있습니다.int(math.ceil(363))
RW Sinnet

9
@Sinnet : 실제로 파이썬은 강력하게 타이핑되었다고 말할 수 있습니다. stackoverflow.com/a/11328980/5069869
Bernhard

1
@ TheEspinosa : 예, 파이썬은 확실히 강력하게 입력됩니다. 많은 함수가 일부 매개 변수 유형에 대해 질문하고 대답에 따라 다른 코드를 실행한다는 것입니다.
quamrana

12
@RWSinnet Python 3에서는 math.ceil정수 값을 가진 부동 개체뿐만 아니라 실제 정수 개체를 반환합니다.
Arthur Tacca

때문에, float 정밀도의주의 10000000 * 0.00136 = 13600.000000000002를 많이 높일 수 천장을 만들다math.ceil(10000000 * 0.00136) = 13601.0
ofthestreet

170

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

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

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


38
좋은. //정수 나누기 에도 사용할 수 있으므로 이것이됩니다 21 // 5 + (21 % 5 > 0).
naught101

6
정수만 관련된 경우 이것이 가장 좋은 솔루션입니다. 불필요한 것은 없습니다 float. 좋은.
Nico Schlömer

158

기억해야 할 흥미로운 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

44
에서 파이썬 2.x에서 : INT / INT -> INT INT / 플로트 ->에 떠 파이썬 3.x를을 : INT / INT는 플로트가 발생할 수 있습니다
gecco


110

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

rounded_up = -(-numerator // denominator)

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

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

1
수학 연산을 수행 할 필요가없는 경우는 어떻습니까? 즉, 하나의 숫자 만 있습니다.
Klik

2
@ Klik : 그렇다면 1 ==>-(-num // 1)로 나눌 수 있으며 답을 얻습니다 :-) 좋은 하루 되세요! David Bau : 아주 좋은 제안입니다!
Marco smdm

10
나는 여기에 모든 대답을했고 이것은 다음 최고 (math.ceil)보다 5 배 빠릅니다. @Andreas는 같은 시간을 가졌습니다
미니 totent

@minitotent 간단한 정수 나누기와 두 번의 단일 사이클 연산이기 때문에 놀라운 일이 아닙니다. 이것은 당신에게 직업을 얻는 일종의 대답입니다. 언어뿐만 아니라 그 아래의 모든 추상화 계층을 이해합니다.
Nearoo

좋은! 나는 항상을 사용했는데 (num + den - 1) // den, int양의 분모를 가진 입력에는 적합하지만 단일 비적 분이 포함 되어도 float(분자 또는 분모) 실패합니다 . 이것은 더 마술처럼 보이지만 ints와 floats 모두에서 작동합니다 . 작은 분자의 경우 더 빠르지 만 (CPython 3.7.2에서는) 배열 기반 수학이 필요할 정도로 분자 만 충분히 크면 접근 속도가 느려집니다. 분할 작업이 유사해야하고 두 개의 단항 부정이 더하기 + 빼기보다 저렴해야하므로 이것이 왜 그런지 명확하지 않습니다.
ShadowRanger

56

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

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

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

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


3
numpy를 사용하는 것도 좋습니다. 수학은 라이브러리에 내장 된 파이썬의 일부이기 때문에 가장 쉬운 방법입니다. 더 의미가 있습니다. 다른 문제에 많은 numpy를 사용하면 언급 한 것처럼 numpy.ceil :-)을 사용하는 것이 합리적입니다.
Marco smdm

30

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)

1
파이썬 3을 사용한다면 입력은 반드시 float 일 필요는 없습니다 : 내부적으로 ceil() 처리 할 것입니다
guival


11

나는 아무도 제안하지 않은 것에 놀랐다

(numerator + denominator - 1) // denominator

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


2
정적으로 유형이 지정된 언어에만 해당됩니다. 분모가 플로트이면 죽었다.
Bharel

분모가 양수인 경우에도 일관되게 작동합니다. 분모가 음수이면 1수학을 빼기 전에 빼기 대신 더하거나 분자와 분모 모두의 부호를 뒤집어 야합니다.
ShadowRanger

7

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

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

그러나

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

6

이 시도:

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

1
영리한. ((int(a) - a) != 0)표현을 반환 1할 때마다 a필요는 반올림한다. 답을 넓히고 이것이 어떻게 작동하는지 설명하고 싶을 수도 있습니다.
Tom Aranda

@TomAranda 부울 표현식이 어떻게 값으로 평가되는지 설명 할 수 있습니까?
Bowen Liu

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

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


당신의 숫자가 3그렇다면, 그것은 4누군가가 원하는 것일 수도 아닐 수도있는 것으로
올릴

15
이것은 모든 경우의 99 %에서만 작동합니다. 당신은 이것을 올바르게 생각하지 않았습니다. 이러한 솔루션은 모든 비용을 피해야합니다.
Nearoo

그래서 +.5 대신 + .49999999 나에게 충분합니다.
FlyingZebra1

5

위의 답변은 정확하지만 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.


1
그리고 기분이 int(g) + (g % 1 > 0)
좋으면

from math import ceil전체 수학 모듈 가져 오기를 수정하는 것 같습니다 :)
SH7890

@ SH7890 나는 선이 import math무대 뒤에서 일어나는 일과 크게 다르지 않다는 것을 두려워합니다 . 를 제외한 모든 기호를 삭제합니다 ceil.
Nearoo

5

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

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)

5

반올림하고 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

3

누구나 특정 소수점 이하 자릿수로 반올림하려고하는 경우 :

import math
def round_up(n, decimals=0):
    multiplier = 10 ** decimals
    return math.ceil(n * multiplier) / multiplier

1

이 답변을 아직 보지 못해서 놀랐 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하지만, 그렇지 않습니다.


2
0.4999를 사용하면 정확히 ???. 0001이 아니라 ???. 0000에서 ???. 0001 (열기 간격) 사이의 입력에 대해 올바른 결과를 제공하지 못합니다. 예를 들어 3.00005로 시도하면 예상 4 대신 3의 결과를 얻습니다. 물론 부동 소수점의 최대 정밀도까지 더 많은 자릿수를 추가하여 이러한 일이 발생할 가능성을 줄일 수 있습니다. math.ceil()?를 사용하는 것과 같이보다 강력하고 직관적 인 솔루션이 있다면 그것을 지적하십시오 .
blubberdiblub

@blubberdiblub 내 대답에 I state Without importing I use:. x + 0.4999또한와 같으면 실패 할 것이라고 언급했습니다 [n].5000.
Klik

4
예, 귀하의 답변에 솔루션을 가져 오지 않고 있지만 그 가치는 보이지 않습니다. 이 math모듈 math.ceil()은 표준 라이브러리에 있으므로 추가 자료를 설치하지 않고도 모든 실제 목적으로 어디서나 사용할 수 있습니다. 그리고 그것이 실패했을 때의 언급에 관해서는, 단일 지점이 아닌 전체 간격으로 실패하기 때문에 대답이 불완전합니다. 기술적으로, 당신은 당신이 말한대로 당신이 올바른지 주장 할 수 있는 경우 가 아닌 IFF에 , 그러나 덜 실제보다이라고는 캐주얼 독자에 인상을 만들 것입니다.
blubberdiblub 5

0

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

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

0

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

-round(-x-0.5)

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

건배


2
이것은 여전히 ​​반올림합니다-round(-x-0.3) = x
Diblo Dk

0

파이썬에서 4500/1000을 작동하면 기본 파이썬이 결과를 정수로 가정하기 때문에 결과는 4가됩니다. 4500/1000 = 4.5-> int (4.5) = 4이고 ceil은 4는 분명히 4입니다.

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

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

행운을 빕니다!!


그것은 Python 2.x에서만 적용됩니다. Python 3에서 단일로 /나누면 항상 부동이 발생하므로 4500/1000항상 4.5입니다.
Nearoo 2016 년

0

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

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


2
num이 2.05 인 경우 작동하지 않습니다. 적어도 9는 숫자로 입력해야하며 0.999는 1입니다. 그러나 코너 케이스 2는 다시 반올림됩니다. -math.ceil이 존재하는 이유가 있다고 생각합니다.
Johannes Maria Frank

-1

층 분할을 사용하여 1을 추가 할 수 있습니다. 2.3 // 2 + 1


2
또는 ceil()이상하게 반대하고 보상하는 대신 사용
guival

2
작동하지 않습니다. 예 :from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
Carl Thomé

-1

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

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

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

"반올림"은 예를 들어 2.3로 바뀌는 것을 의미합니다 3.
Nearoo 2016 년

-2

내 몫

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

반올림 :

101 * 19% = 19.19

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

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

-3

나는 기본적으로 파이썬 초보자이지만, 당신이 그냥 아래로 반올림하려고하는 이유는 무엇입니까?

round(integer) + 1

2
반올림 후 원하는 값은 3이지만 식은 4로 바뀝니다.
Pranav Shukla

1
제 생각 round(integer + 0.5)에는 이것이 제가 자주하는 일입니다
Klik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.