답변:
CEIL (천장) 기능 :
import math
print(math.ceil(4.2))
int(math.ceil(363))
math.ceil
정수 값을 가진 부동 개체뿐만 아니라 실제 정수 개체를 반환합니다.
10000000 * 0.00136 = 13600.000000000002
를 많이 높일 수 천장을 만들다math.ceil(10000000 * 0.00136) = 13601.0
나는이 답변이 옛날부터 질문에 대한 것이라는 것을 알고 있지만 수학을 가져오고 싶지 않고 그냥 반올림하고 싶다면 이것이 효과적입니다.
>>> int(21 / 5)
4
>>> int(21 / 5) + (21 % 5 > 0)
5
첫 번째 부분은 4가되고 나머지 부분이있는 경우 두 번째 부분은 "참"으로 평가되며, 추가로 True = 1; False = 0. 따라서 나머지가 없으면 동일한 정수를 유지하지만 나머지가 있으면 1을 더합니다.
//
정수 나누기 에도 사용할 수 있으므로 이것이됩니다 21 // 5 + (21 % 5 > 0)
.
float
. 좋은.
기억해야 할 흥미로운 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
정수로 작업하는 경우 반올림하는 한 가지 방법은 반올림한다는 사실을 이용하는 것입니다 //
. 음수로 나누고 답을 부정하십시오. 가져 오기, 부동 소수점 또는 조건부 필요가 없습니다.
rounded_up = -(-numerator // denominator)
예를 들면 다음과 같습니다.
>>> print(-(-101 // 5))
21
(num + den - 1) // den
, int
양의 분모를 가진 입력에는 적합하지만 단일 비적 분이 포함 되어도 float
(분자 또는 분모) 실패합니다 . 이것은 더 마술처럼 보이지만 int
s와 float
s 모두에서 작동합니다 . 작은 분자의 경우 더 빠르지 만 (CPython 3.7.2에서는) 배열 기반 수학이 필요할 정도로 분자 만 충분히 크면 접근 속도가 느려집니다. 분할 작업이 유사해야하고 두 개의 단항 부정이 더하기 + 빼기보다 저렴해야하므로 이것이 왜 그런지 명확하지 않습니다.
numpy를 좋아할 수도 있습니다.
>>> import numpy as np
>>> np.ceil(2.3)
3.0
수학보다 낫다는 말은 아니지만 이미 다른 목적으로 numpy를 사용하고 있다면 코드 일관성을 유지할 수 있습니다.
어쨌든, 내가 만난 세부 사항. 나는 numpy를 많이 사용하고 언급되지 않은 것에 놀랐지 만 물론 허용 된 답변은 완벽하게 작동합니다.
>>> 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
)
1
수학을 빼기 전에 빼기 대신 더하거나 분자와 분모 모두의 부호를 뒤집어 야합니다.
이 시도:
a = 211.0
print(int(a) + ((int(a) - a) != 0))
((int(a) - a) != 0)
표현을 반환 1
할 때마다 a
필요는 반올림한다. 답을 넓히고 이것이 어떻게 작동하는지 설명하고 싶을 수도 있습니다.
>>> def roundup(number):
... return round(number+.5)
>>> roundup(2.3)
3
>>> roundup(19.00000000001)
20
이 기능은 모듈이 필요하지 않습니다.
3
그렇다면, 그것은 4
누군가가 원하는 것일 수도 아닐 수도있는 것으로
위의 답변은 정확하지만 math
이 함수 하나에 대해서만 모듈을 가져 오는 것은 일반적으로 약간의 잔인한 느낌입니다. 운 좋게도 다른 방법이 있습니다.
g = 7/5
g = int(g) + (not g.is_integer())
True
및 False
로 해석됩니다 1
및 0
파이썬의 숫자를 포함 성명에서. g.is_interger()
기본적으로 g.has_no_decimal()
또는로 번역됩니다 g == int(g)
. 영어의 마지막 문장은 다음과 같습니다 round g down and add one if g has decimal
.
int(g) + (g % 1 > 0)
from math import ceil
전체 수학 모듈 가져 오기를 수정하는 것 같습니다 :)
import math
무대 뒤에서 일어나는 일과 크게 다르지 않다는 것을 두려워합니다 . 를 제외한 모든 기호를 삭제합니다 ceil
.
// 기본 환경을 사용하여 수학을 가져 오지 않고 :
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)
이 답변을 아직 보지 못해서 놀랐 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
하지만, 그렇지 않습니다.
math.ceil()
?를 사용하는 것과 같이보다 강력하고 직관적 인 솔루션이 있다면 그것을 지적하십시오 .
Without importing I use:
. x + 0.4999
또한와 같으면 실패 할 것이라고 언급했습니다 [n].5000
.
math
모듈 math.ceil()
은 표준 라이브러리에 있으므로 추가 자료를 설치하지 않고도 모든 실제 목적으로 어디서나 사용할 수 있습니다. 그리고 그것이 실패했을 때의 언급에 관해서는, 단일 지점이 아닌 전체 간격으로 실패하기 때문에 대답이 불완전합니다. 기술적으로, 당신은 당신이 말한대로 당신이 올바른지 주장 할 수 있는 경우 가 아닌 IFF에 , 그러나 덜 실제보다이라고는 캐주얼 독자에 인상을 만들 것입니다.
파이썬에서 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로 직접 리턴하기 때문입니다
행운을 빕니다!!
/
나누면 항상 부동이 발생하므로 4500/1000
항상 4.5입니다.
아무것도 가져오고 싶지 않으면 언제든지 다음과 같이 간단한 함수를 작성할 수 있습니다.
def RoundUP(num):
if num== int(num):
return num
return int(num + 1)
층 분할을 사용하여 1을 추가 할 수 있습니다. 2.3 // 2 + 1
ceil()
이상하게 반대하고 보상하는 대신 사용
from math import ceil; assert 4 // 2 + 1 == ceil(4 / 2)
int()
와 사이의 작동 메커니즘을 혼동하고 있다고 생각합니다 round()
.
int()
부동 숫자가 제공되면 항상 10 진수를 자릅니다. 반면 round()
,시 2.5
곳 2
과 3
행 동일한 거리에 모두 2.5
그 이상 떨어진 지점에서 0 중 파이썬 복귀.
round(2.5) = 3
int(2.5) = 2
2.3
로 바뀌는 것을 의미합니다 3
.
나는 기본적으로 파이썬 초보자이지만, 당신이 그냥 아래로 반올림하려고하는 이유는 무엇입니까?
round(integer) + 1
round(integer + 0.5)
에는 이것이 제가 자주하는 일입니다
round(number + .5)
숫자가 정수이면 작동하지 않습니다.round(3+.5) == 4
당신이 실제로 원할 때3
.