HOWTO · Python

TypeError 수정: Python에서 'float' 개체를 정수로 해석할 수 없음

이 글에서는 Python의 `TypeError: 'float' object cannot be interpreted as an integer` 오류를 해결하기 위해 `range()`에 전달하기 전에 float를 정수로 변환하고, 의도한 반복 횟수에 맞는 변환 방법을 선택하는 법을 설명합니다.

이 페이지의 내용

TypeError: 'float' object cannot be interpreted as an integer 오류가 보인다면, 정수가 필요한 자리에 float가 전달된 것입니다. 흔한 원인은 range()에 소수 값을 넣는 것입니다. 의도한 반복 횟수에 맞춰 값을 변환하세요. 변환 방법에 따라 반복 횟수가 달라집니다.

float에 range()를 전달하면 이 TypeError가 발생하는 이유

range()는 정수 시퀀스를 만들기 때문에 시작값, 종료값, 간격 인수는 정수이거나 Python의 정수 인덱스 프로토콜을 구현한 정수 유사 객체여야 합니다. 소수 부분이 0인 3.0도 허용되지 않습니다. 소수 부분이 0이어도 타입은 int가 아니라 여전히 float입니다. 예를 들어 range(3.5)를 호출하면 TypeError: 'float' object cannot be interpreted as an integer가 발생합니다.

Python은 정수와 부동소수점 값을 서로 다른 타입으로 구분합니다. 3의 타입은 int이고 3.5의 타입은 float입니다. 계산 결과가 float여도 이후 반복문에는 정수 개수가 필요할 수 있습니다. 이 오류는 range() 호출 시 두 타입이 맞지 않는다는 뜻이지, Python이 float를 저장하거나 계산할 수 없다는 뜻은 아닙니다.

range()를 사용하기 전에 float를 정수로 변환하기

개수를 range()에 전달하기 전에 변환하고, 그 개수가 무엇을 나타내는지에 따라 방법을 선택하세요. 내장 함수인 int()는 별도로 가져오지 않아도 사용할 수 있습니다. 소수 부분을 0 방향으로 버리므로 int(3.7)은 3, int(-3.7)은 -3입니다. 가장 가까운 정수로 반올림하는 함수는 아닙니다. 값이 측정량이나 계산된 한도를 나타낸다면, 소수 부분을 버리는 방식이 의도한 반복 횟수에 맞는지 판단하세요.

math.floor()와 math.ceil()는 Python 표준 라이브러리의 math 모듈에서 제공되므로 패키지를 설치할 필요가 없습니다. import math를 사용하세요. math.floor()는 입력값보다 작거나 같은 정수 중 가장 큰 값을 반환하고, math.ceil()는 입력값보다 크거나 같은 정수 중 가장 작은 값을 반환합니다. 3.7의 floor는 3, ceil은 4이고, -3.7의 floor는 -4, ceil은 -3입니다. 변환 결과가 반복문을 제어할 때 이 차이가 중요합니다. 음수에서 내림하면 0에서 더 멀어지지만, int()는 0 방향으로 값을 변환합니다.

값을 바꾸기 전에 무엇을 세는 값인지, 단위의 일부가 무엇을 뜻하는지, 마지막 부분 단위까지 포함해야 하는지 확인하세요. 재시도 한도, 페이지 수, 레코드 수에는 각각 다른 규칙이 필요할 수 있습니다. 다른 계산에서 정밀도가 필요할 수 있으므로 원래 측정값도 보관하세요. 아래 프로그램은 선택한 정수 개수를 일반 시퀀스에 적용합니다.

이 예제를 실행해 보세요. 코드와 이어지는 선택 가능한 출력에는 int: 3과 ceil: 4라는 영어 레이블이 표시되며, 반복문 값도 확인할 수 있습니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

import math

count = 3.7
truncated = int(count)
rounded_up = math.ceil(count)
print("int:", truncated)
print("ceil:", rounded_up)
for index in range(truncated):
    print(index)
int: 3
ceil: 4
0
1
2

필요한 결과에 따라 int(), math.floor(), math.ceil() 중에서 선택하기

소수 부분을 0 방향으로 버리는 것이 의도한 규칙이라면 int()를 사용하세요. 개수가 원래 값보다 커지면 안 된다면 math.floor()를, 원래 값보다 작아지면 안 된다면 math.ceil()를 사용하세요. 양수 입력에서는 int()와 math.floor()의 결과가 같지만, 음의 정수가 아닌 값에서는 서로 다릅니다. 어느 방법이든 항상 옳은 것은 아닙니다. float가 기간인지, 처리할 수량인지, 아니면 한도인지 살펴보고 원하는 개수를 만드는 규칙을 선택하세요.

유한한 float에 세 변환을 적용하면 모두 정수가 되므로 결과를 range()에 사용할 수 있습니다. 다만 소수 정보는 사라지므로 이후 계산에 원래 값이 필요하다면 float를 별도로 보관하세요. 값이 애초에 정수 개수여야 한다면 변환으로 개수를 조용히 바꾸기보다 값이 만들어지는 부분을 수정하거나 변환 전에 검증하는 편이 나을 수 있습니다.

변환된 값과 반복문 출력을 확인하기

변환된 개수와 반복문에서 나오는 값을 모두 살펴보세요. range(n)은 0에서 시작해 1씩 증가하고 n 직전에 멈춥니다. 따라서 개수가 3이면 0, 1, 2가 나와 세 번 반복합니다. 개수가 0이면 반복하지 않으며, 기본 양수 간격을 사용할 때 종료값이 음수여도 값이 나오지 않습니다. 이런 동작을 확인하면 변환으로 프로그램이 수행하는 작업이 달라졌는지 알 수 있습니다.

예제의 선택 가능한 출력에는 영어 레이블 int: 3과 ceil: 4가 표시되고, 반복문 값 0, 1, 2도 이어서 표시됩니다. 이 값들로 3.7의 소수 부분을 버린 효과를 확인할 수 있습니다. 다른 입력을 확인하려면 count를 바꾸고 변환 결과를 의도한 규칙과 비교하세요. 음수를 입력한다면 종료값으로 사용하기 전에 int(count), math.floor(count), math.ceil(count)의 결과를 비교하세요. 올바른 수정은 TypeError를 없애는 아무 변환이나 고르는 것이 아니라, 원하는 반복 횟수를 만드는 변환을 선택하는 것입니다.