제목에서 알 수 있듯이 부동 소수점 숫자를 가장 가까운 정수로 내림하고 싶습니다. 그러나 전체가 아닌 경우 다음 정수에 얼마나 가까운 지에 관계없이 항상 변수를 반올림하고 싶습니다. 이를 수행하는 방법이 있습니까?
제목에서 알 수 있듯이 부동 소수점 숫자를 가장 가까운 정수로 내림하고 싶습니다. 그러나 전체가 아닌 경우 다음 정수에 얼마나 가까운 지에 관계없이 항상 변수를 반올림하고 싶습니다. 이를 수행하는 방법이 있습니까?
답변:
단순한
print int(x)
잘 작동합니다.
int(-23.3) == 23
다음 중 하나가 작동합니다.
import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2
math.trunc
은 정수이고의 출력은 math.floor
부동 소수점입니다.
type(math.floor(1.51)) -> int
및 type(math.trunc(1.51)) -> int
현재python 3.6.0
x//1
//
운영자는 분단의 바닥을 반환합니다. 1로 나누어도 숫자는 바뀌지 않으므로 플로어와 동일하지만 가져 오기가 필요하지 않습니다. 노트:
int(-1.1) == -1
동안 -1.1//1 == -2.0
단 decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')
(설명 된대로, 제 2 항은 대한 사실이 아니다 decimal
), 그래서 방법에 의존 //
동작합니다가 완전히 안정, 오늘날에도이 아니다.
바닥 기능이 필요하다고 생각합니다.
많은 사람들이를 사용하라고 말하고 int(x)
이것은 대부분의 경우에 잘 작동하지만 약간의 문제가 있습니다. OP의 결과가 다음과 같은 경우 :
x = 1.9999999999999999
그것은
x = 2
16 일 9 일 이후에는 반올림됩니다. 그런 일을 결코 만나지 않을 것이라고 확신한다면 이것은 큰 문제가 아닙니다. 그러나 명심해야 할 사항입니다.
1.9999999999999999
실제로 2.0
내부 float64 표현 과 동일하기 때문 입니다 . I. e. 64 비트 부동 소수점은 많은 유효 자릿수를 나타낼 수 없으므로 부동 소수점으로 파싱되는 즉시 반올림됩니다. 평가를 통해 확인할 수 있습니다 1.9999999999999999 == 2.0
. 그리고 같음 연산이 부동 소수점에서 반올림을 수행한다고 의심되는 경우 이진 표현을 struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)
와도 비교할 수 있습니다 .
int()
. 값은 이미 2.0이며 2에 행복을 변환합니다
int()
가 전적으로과 관련이있다, 의 부적절한 사용float
으로, 1.9999999999999999
반올림됩니다 2.0
컴파일 시간에 (동시에 int()
실행 시간에 호출). 당신이 변수에 대한 올바른 데이터 형식을 사용하는 경우, 모든 것이 예상대로 작동합니다 int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))
제공1
수학을 가져 오지 않으려면 다음을 사용할 수 있습니다.
int(round(x))
다음은 문서입니다.
>>> help(round)
Help on built-in function round in module __builtin__:
round(...)
round(number[, ndigits]) -> floating point number
Round a number to a given precision in decimal digits (default 0 digits).
This always returns a floating point number. Precision may be negative.
round
1 년 전이 질문에 대한 답변으로 이미 논의되고 거부되었습니다. OP는 math.floor
.
numpy로 작업하는 경우 음수로도 작동하는 다음 솔루션을 사용할 수 있습니다 (배열에서도 작동합니다)
import numpy as np
def round_down(num):
if num < 0:
return -np.ceil(abs(num))
else:
return np.int32(num)
round_down = np.vectorize(round_down)
round_down([-1.1, -1.5, -1.6, 0, 1.1, 1.5, 1.6])
> array([-2., -2., -2., 0., 1., 1., 1.])
math
모듈 대신 모듈을 사용하면 작동 할 것이라고 생각합니다 numpy
.
매우 간단 할 수 있지만, 마이너스 1로 반올림 할 수 없습니까? 예를 들면 :
number=1.5
round(number)-1
> 1
integer
.