부동 소수점 숫자를 가장 가까운 정수로 반올림 하시겠습니까?


128

제목에서 알 수 있듯이 부동 소수점 숫자를 가장 가까운 정수로 내림하고 싶습니다. 그러나 전체가 아닌 경우 다음 정수에 얼마나 가까운 지에 관계없이 항상 변수를 반올림하고 싶습니다. 이를 수행하는 방법이 있습니까?


2
가능한 어려움은 IEEE 부동 소수점 형식이 1보다 큰 숫자를 나타낼 수 있다는 것입니다. 따라서 x를 반올림 할 수 있지만 x + 1을 반올림하면 예상 한 결과를 얻을 수 없습니다.
dmckee --- 전 중재자 새끼 고양이

몇 가지 예를 게시하십시오.
애쉬 위니 Chaudhary

답변:


179

단순한

print int(x)

잘 작동합니다.


7
int (0.6) = 1이 아닌 0
Helin Wang 2013

39
@HelinWang OP가 정확히 요청한 것입니다.
Petr Peller 2013

5
이것은 가장 Pythonic 접근 방식처럼 보입니다.
Gyan Veda

23
이것은 양수 잘 작동하지만, 음수는 반올림됩니다int(-23.3) == 23
알렉스 라일리

2
600851475143과 같은 정수 범위를 초과하는 숫자에 대해서는 작동하지 않으며 기본적으로 메모리 오류를 플래그합니다.
Muyide Ibukun

77

다음 중 하나가 작동합니다.

import math
math.trunc(1.5)
> 1
math.trunc(-1.5)
> -1
math.floor(1.5)
> 1
math.floor(-1.5)
> -2

14
의 출력 math.trunc은 정수이고의 출력은 math.floor부동 소수점입니다.
evedovelli 2013

6
@evedovelli : 더 이상은 아닙니다. type(math.floor(1.51)) -> inttype(math.trunc(1.51)) -> int현재python 3.6.0
SKPS

4
이 옵션은 "int (x)"보다 더 명시 적이므로 더 Pythonic입니다.
Tristan

44
x//1

//운영자는 분단의 바닥을 반환합니다. 1로 나누어도 숫자는 바뀌지 않으므로 플로어와 동일하지만 가져 오기가 필요하지 않습니다. 노트:

  1. 이것은 float를 반환합니다.
  2. 이것은 -∞로 반올림됩니다.

좋은 추가. int(-1.1) == -1동안 -1.1//1 == -2.0decimal.Decimal('-1.1')//1 == decimal.Decimal('-1')(설명 된대로, 제 2 항은 대한 사실이 아니다 decimal), 그래서 방법에 의존 //동작합니다가 완전히 안정, 오늘날에도이 아니다.
Tino

28

부동 소수점 결과를 얻으려면 다음을 사용하십시오.

round(x-0.5)

음수에서도 작동합니다.


6
입니다 매우 정교한
아론


9

많은 사람들이를 사용하라고 말하고 int(x)이것은 대부분의 경우에 잘 작동하지만 약간의 문제가 있습니다. OP의 결과가 다음과 같은 경우 :

x = 1.9999999999999999

그것은

x = 2

16 일 9 일 이후에는 반올림됩니다. 그런 일을 결코 만나지 않을 것이라고 확신한다면 이것은 큰 문제가 아닙니다. 그러나 명심해야 할 사항입니다.


17
이는 1.9999999999999999실제로 2.0내부 float64 표현 과 동일하기 때문 입니다 . I. e. 64 비트 부동 소수점은 많은 유효 자릿수를 나타낼 수 없으므로 부동 소수점으로 파싱되는 즉시 반올림됩니다. 평가를 통해 확인할 수 있습니다 1.9999999999999999 == 2.0. 그리고 같음 연산이 부동 소수점에서 반올림을 수행한다고 의심되는 경우 이진 표현을 struct.pack("d", 1.9999999999999999) == struct.pack("d", 2.0)와도 비교할 수 있습니다 .
blubberdiblub 2015 년

4
그리고 그것이 정확히 당신의 요점이라면, 나는 무엇이 잘못되었는지 보지 못합니다 int(). 값은 이미 2.0이며 2에 행복을 변환합니다
blubberdiblub

1
OP (또는 미래에 이것을 읽는 사람)의 의도가 어떤 이유로 든 가장 가까운 정수 (반올림 값이 아님)를 사용하는 것이라면 염두에 두어야 할 사항입니다.
lokilindo

3
@lokilindo 그러나 이것은와는 아무 상관이 없다 int()가 전적으로과 관련이있다, 의 부적절한 사용float 으로, 1.9999999999999999반올림됩니다 2.0 컴파일 시간에 (동시에 int()실행 시간에 호출). 당신이 변수에 대한 올바른 데이터 형식을 사용하는 경우, 모든 것이 예상대로 작동합니다 int(decimal.Decimal('1.9999999999999999999999999999999999999999999999999999999'))제공1
티노

6

수학을 가져 오지 않으려면 다음을 사용할 수 있습니다.

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.

답변 해 주셔서 감사합니다. 다음 번에는 적절한 코드 (괄호 닫기)를 작성하고 문서를 제공하면 더 나은 수신을 얻을 수 있습니다.
Geoff

2
round1 년 전이 질문에 대한 답변으로 이미 논의되고 거부되었습니다. OP는 math.floor.
Adam Smith

3

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

이 문제를 해결했는지 모르겠지만이 질문을 우연히 발견했습니다. 소수점을 없애고 싶다면 int (x)를 사용하면 십진수를 모두 제거 할 수 있습니다. round (x)를 사용할 필요가 없습니다.


1

make round (x-0.5) 이것은 항상 Float의 다음 반올림 된 Integer 값을 반환합니다. do round (x + 0.5)로 쉽게 반올림 할 수 있습니다.


-1

매우 간단 할 수 있지만, 마이너스 1로 반올림 할 수 없습니까? 예를 들면 :

number=1.5
round(number)-1
> 1

4
이것은 정수에 대해 잘못된 답을 제공합니다. 예를 들어, 반올림 된 2.0은 2이고 1을 빼면 잘못된 결과 1이 표시됩니다.
Pascal Cuoq

@PascalCuoq 나는 당신의 문제를 이해하지 못합니다. 결과로 1.0을 원하십니까? OP는 분명히 반올림하고 싶었 기 때문에 가장 가까운 integer.
bad_keypoints

1
@bad_keypoints OP가 2.0에서 1로 반올림하고 싶지 않다고 생각합니다.
Pascal Cuoq

@PascalCuoq 죄송합니다, 방금 우리가있는 댓글 스레드의 답변을 다시 살펴 보았습니다.
bad_keypoints

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.