Python 에서 부동 소수점 숫자가 소수 부분을 갖지 않는지 확인하는 방법

PythonBeginner
지금 연습하기

소개

이 랩에서는 Python 에서 부동 소수점 숫자가 소수 부분을 갖지 않는지 확인하는 방법을 배우고, 부동 소수점 표현으로 인한 문제를 해결합니다. 이 랩은 부동 소수점 숫자의 내재적인 부정확성을 탐구하고, 이것이 직접적인 비교에 미치는 영향에 대해 설명하는 것으로 시작합니다. 0.1 + 0.2와 같은 겉보기에는 간단한 계산이 예상과 약간 다른 결과를 초래하여 예상치 못한 비교 결과를 초래하는 방식을 관찰하기 위해 Python 스크립트를 생성합니다.

그런 다음 이 랩은 부동 소수점이 실제로 정수를 나타내는지 확인하는 두 가지 방법을 안내합니다: is_integer() 메서드를 사용하고 부동 소수점을 정수 변환과 비교하는 방법입니다. 이러한 기술은 기본 표현의 제한에도 불구하고 소수 구성 요소가 없는 부동 소수점을 정확하게 식별하기 위한 실용적인 솔루션을 제공합니다.

부동 소수점 표현 탐구

이 단계에서는 Python 에서 부동 소수점 숫자가 어떻게 표현되는지, 그리고 이 표현이 수치 비교에 미칠 수 있는 잠재적 영향에 대해 탐구합니다. 부동 소수점 숫자는 컴퓨터에서 실수 (소수점이 있는 숫자) 를 나타내는 데 사용됩니다. 그러나 메모리에 저장되는 방식 때문에 실제 실수의 근사치인 경우가 많습니다. 이로 인해 비교를 수행할 때 예상치 못한 결과가 발생할 수 있습니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 float_representation.py라는 Python 파일을 생성하는 것으로 시작해 보겠습니다.

## Create a floating-point number
x = 0.1 + 0.2

## Print the value of x
print(x)

파일을 저장한 다음 터미널에서 다음 명령을 사용하여 실행합니다.

python float_representation.py

출력이 0.3일 것으로 예상할 수 있지만, 다음과 유사한 내용을 보게 될 것입니다.

0.30000000000000004

이는 0.10.2가 부동 소수점 숫자로 정확하게 표현될 수 없기 때문입니다. 덧셈의 결과는 0.3에 매우 가깝지만 정확히 같지는 않은 숫자입니다.

이제 이 부정확성이 비교에 어떤 영향을 미칠 수 있는지 살펴보겠습니다. float_representation.py 파일에 다음 코드를 추가합니다.

## Create a floating-point number
x = 0.1 + 0.2

## Check if x is equal to 0.3
if x == 0.3:
    print("x is equal to 0.3")
else:
    print("x is not equal to 0.3")

파일을 저장하고 다시 실행합니다.

python float_representation.py

다음과 같은 출력을 보게 될 것입니다.

x is not equal to 0.3

이는 부동 소수점 표현 문제로 인해 x가 정확히 0.3과 같지 않기 때문입니다.

부동 소수점 숫자를 정확하게 비교하려면 허용 오차 값을 사용해야 합니다. 정확한 동일성을 확인하는 대신, 두 숫자 간의 절대 차이가 작은 허용 오차 값보다 작은지 확인합니다.

float_representation.py 파일을 수정하여 허용 오차를 포함합니다.

## Create a floating-point number
x = 0.1 + 0.2

## Define a tolerance value
tolerance = 1e-9  ## A small value like 0.000000001

## Check if x is approximately equal to 0.3
if abs(x - 0.3) < tolerance:
    print("x is approximately equal to 0.3")
else:
    print("x is not approximately equal to 0.3")

파일을 저장하고 다시 한 번 실행합니다.

python float_representation.py

이제 다음과 같은 출력을 보게 될 것입니다.

x is approximately equal to 0.3

허용 오차를 사용하면 표현의 내재적인 부정확성에도 불구하고 부동 소수점 숫자를 정확하게 비교할 수 있습니다. 이는 Python 및 기타 프로그래밍 언어에서 부동 소수점 숫자로 작업할 때 이해해야 할 중요한 개념입니다.

is_integer() 메서드 사용

이 단계에서는 is_integer() 메서드를 사용하여 부동 소수점 숫자가 정수 값을 나타내는지 확인하는 방법을 배웁니다. is_integer() 메서드는 Python 에서 float 객체에 대한 내장 메서드로, 부동 소수점 숫자가 정수 값 (즉, 소수 부분이 0) 을 가지면 True를 반환하고, 그렇지 않으면 False를 반환합니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 is_integer_example.py라는 새 Python 파일을 생성해 보겠습니다.

## Example 1: Integer value
x = 5.0
print(x.is_integer())

## Example 2: Non-integer value
y = 3.14
print(y.is_integer())

## Example 3: Another integer value
z = -2.0
print(z.is_integer())

파일을 저장하고 터미널에서 다음 명령을 사용하여 실행합니다.

python is_integer_example.py

다음과 같은 출력을 보게 될 것입니다.

True
False
True

보시다시피, is_integer()는 정수 값을 나타내기 때문에 5.0-2.0에 대해 True를 반환하고, 소수 부분이 있기 때문에 3.14에 대해 False를 반환합니다.

이제 이전 단계에서 논의한 부동 소수점 표현 문제를 고려해 보겠습니다. 때로는 정수여야 하는 숫자가 부동 소수점 부정확성으로 인해 정확하게 표현되지 않을 수 있습니다.

is_integer_example.py 파일을 수정하여 다음 코드를 포함합니다.

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
print(a.is_integer())

파일을 저장하고 다시 실행합니다.

python is_integer_example.py

다음과 같은 출력을 보게 될 것입니다.

0.30000000000000004
False

0.1 + 0.2가 수학적으로 0.3과 같더라도 부동 소수점 표현이 약간 다르므로 is_integer()False를 반환합니다.

이러한 경우를 처리하기 위해 이전 단계에서 배운 대로 is_integer()를 허용 오차 검사와 결합할 수 있습니다. 그러나 이 경우, 숫자가 특정 값과 '같음'이 아니라 정수를 '나타내는지' 확인하고 있습니다.

요약하면, is_integer() 메서드는 부동 소수점 숫자가 정수 값을 나타내는지 확인하는 데 유용한 도구입니다. 그러나 부동 소수점 부정확성의 잠재적 영향에 유의하고 이 메서드를 사용할 때 그 영향을 고려하십시오.

int() 변환과 비교

이 단계에서는 부동 소수점 숫자가 정수 값을 나타내는지 확인하는 또 다른 방법, 즉 int() 함수를 사용하여 정수 변환과 비교하는 방법을 탐구합니다. int() 함수는 부동 소수점 숫자의 소수 부분을 잘라내어 효과적으로 0 에 가까운 가장 가까운 정수로 변환합니다.

VS Code 편집기를 사용하여 ~/project 디렉토리에 int_conversion.py라는 새 Python 파일을 생성해 보겠습니다.

## Example 1: Integer value
x = 5.0
if x == int(x):
    print("x is an integer")
else:
    print("x is not an integer")

## Example 2: Non-integer value
y = 3.14
if y == int(y):
    print("y is an integer")
else:
    print("y is not an integer")

## Example 3: Another integer value
z = -2.0
if z == int(z):
    print("z is an integer")
else:
    print("z is not an integer")

파일을 저장하고 터미널에서 다음 명령을 사용하여 실행합니다.

python int_conversion.py

다음과 같은 출력을 보게 될 것입니다.

x is an integer
y is not an integer
z is an integer

이 접근 방식은 부동 소수점 숫자가 이미 정수를 나타내는 경우 int()를 사용하여 정수로 변환해도 값이 변경되지 않기 때문에 작동합니다. 부동 소수점 숫자에 소수 부분이 있는 경우 int() 함수는 이를 잘라내어 다른 값을 생성합니다.

이제 부동 소수점 표현 문제를 다시 고려해 보겠습니다. int_conversion.py 파일을 수정하여 다음 코드를 포함합니다.

## Example 4: Floating-point imprecision
a = 0.1 + 0.2
print(a)
if a == int(a):
    print("a is an integer")
else:
    print("a is not an integer")

파일을 저장하고 다시 실행합니다.

python int_conversion.py

다음과 같은 출력을 보게 될 것입니다.

0.30000000000000004
a is not an integer

이전 단계와 마찬가지로 부동 소수점 부정확성으로 인해 a0.3과 약간 다르므로 정수 변환 (0) 과 같지 않습니다.

정수 표현을 확인하기 위해 int() 변환을 사용하는 것은 is_integer()를 사용하는 것보다 덜 정확할 수 있다는 점에 유의하는 것이 중요합니다. is_integer()는 부동 소수점 숫자가 정수 값을 '나타내는지' 확인하는 반면, int()와 비교하는 것은 부동 소수점 숫자가 정수 절삭 값과 '같은지' 확인합니다.

요약하면, int()를 사용하여 부동 소수점 숫자를 정수 변환과 비교하는 것은 정수 값을 나타내는지 확인하는 또 다른 방법입니다. 그러나 부동 소수점 부정확성의 잠재적 영향을 염두에 두고 보다 정확한 결과를 얻으려면 is_integer()를 사용하는 것을 고려하십시오.

요약

이 랩에서는 Python 에서 부동 소수점 표현의 복잡성과 수치 비교에 미치는 영향을 살펴보았습니다. 부동 소수점 숫자는 메모리에 저장되기 때문에 종종 실수에 대한 근사치이며, 직접적인 등가 비교를 수행할 때 잠재적인 부정확성을 초래한다는 것을 배웠습니다.

0.10.2를 더하면 정확히 0.3이 아닐 수 있으며, ==를 사용한 직접 비교가 예상치 못한 결과를 초래할 수 있음을 확인했습니다. 이 랩에서는 이러한 제한 사항을 이해하고, 부동 소수점 숫자의 등가성을 정확하게 평가하기 위해 허용 오차 값 사용과 같은 대체 비교 방법의 필요성을 강조했습니다.