개요
이 튜토리얼에서는 주어진 실수(부동 소수점 값)와 비율이 같은 두 개의 정수를 반환하는 프로그램을 작성해 보겠습니다. Python에는 이러한 목표를 손쉽게 달성할 수 있도록 as_integer_ratio()라는 내장 메서드가 제공됩니다.
먼저 몇 가지 예시를 통해 동작 방식을 살펴보겠습니다.
입력: 1.5 출력: 3 / 2 입력: 5.3 출력: 5967269506265907 / 1125899906842624
as_integer_ratio() 메서드란?
as_integer_ratio()는 float 객체에서 호출할 수 있는 내장 메서드로, 해당 실수를 정확히 나타내는 (분자, 분모) 형태의 튜플을 반환합니다. 반환되는 분수는 항상 더 이상 약분할 수 없는 기약 분수이며, 분모는 양수입니다.
예제 1
# 실수 값 초기화
float_value = 1.5
# as_integer_ratio() 메서드로 정수 튜플 가져오기
integers = float_value.as_integer_ratio()
# 결과 출력
print(f'{integers[0]} / {integers[1]}')
출력
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
3 / 2
1.5는 3/2와 정확히 일치하므로 아주 깔끔한 결과가 출력됩니다.
예제 2
# 실수 값 초기화
float_value = 5.3
# as_integer_ratio() 메서드로 정수 튜플 가져오기
integers = float_value.as_integer_ratio()
# 결과 출력
print(f'{integers[0]} / {integers[1]}')
출력
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
5967269506265907 / 1125899906842624
왜 이렇게 큰 숫자가 나올까?
5.3처럼 간단해 보이는 숫자에 거대한 분자와 분모가 출력되는 이유는, 컴퓨터가 실수를 IEEE 754 배정밀도 부동 소수점 방식으로 저장하기 때문입니다. 10진수 5.3은 2진수로 정확하게 표현할 수 없어 미세한 오차를 포함한 근삿값으로 저장되며, as_integer_ratio()는 그 저장된 값을 정확히 나타내는 분수를 반환합니다.
따라서 사람이 읽기 좋은 깔끔한 분수를 얻고 싶다면 fractions.Fraction('5.3')처럼 문자열을 인자로 넘기는 방식을 활용하는 것이 좋습니다.
결론
이번 튜토리얼에서는 Python의 as_integer_ratio() 메서드를 사용해 실수를 기약 분수 형태의 두 정수로 변환하는 방법을 알아보았습니다. 부동 소수점의 내부 표현을 이해하면 이러한 결과가 왜 나오는지 명확해집니다. 궁금한 점이 있다면 댓글로 남겨주세요!