우선 두 if는 동일합니다. 부동 소수점 숫자를 정수와 비교할 때 정수는 부동 소수점 숫자로 변환됩니다. 그럼 왜 나는 10.0이 아닌가? 다음 값과만 동일하기 때문입니다.
으아악
부동소수점을 10진수에서 2진수로 변환하는데 오류가 있는 것을 확인할 수 있습니다. 100번의 오류가 누적되면 i는 9.99999999999998과 같습니다. (저는 Python 3.6을 사용하고 있으며 부동소수점 숫자의 10진수 표현은 가장 짧은 등가 표현을 사용합니다. 또한 C 언어와 동일한 내부 표현을 사용합니다.)
부동소수점 숫자는 컴퓨터에서 이진수 형태로 표현되고 연산되며(보통 IEEE 754 표준 사용), 0.1은 이진수로 정확하게 표현될 수 없습니다. (반복소수점입니다. 분모에 2의 인수만 포함된 소수만 바이너리로 표현됩니다. 그때까지는 순환되지 않습니다.) 이런 식으로 오류가 발생합니다. 오류가 누적되면 십진법에서 점점 더 벗어나게 됩니다.
동일성을 비교해야 하는 경우 지정된 숫자로 차이를 찾을 수 있습니다. 차이가 특정 값(예: Python의 math.isclose 함수)보다 작으면 동일한 것으로 간주됩니다.
정확한 값이 필요한 경우(예: 1페니도 적지 않은 재무 계산 수행) 소위 "십진수"를 사용하여 연산을 수행할 수 있습니다(소수점, Python과 Ruby에서 모두 지원됨). 또한 mpdecimal 라이브러리를 사용하거나, 정밀도를 지정하거나(예: mpfr 라이브러리 사용), 고정 소수점 숫자를 사용합니다.
우선 두 if는 동일합니다. 부동 소수점 숫자를 정수와 비교할 때 정수는 부동 소수점 숫자로 변환됩니다.
으아악그럼 왜 나는 10.0이 아닌가? 다음 값과만 동일하기 때문입니다.
부동소수점을 10진수에서 2진수로 변환하는데 오류가 있는 것을 확인할 수 있습니다. 100번의 오류가 누적되면 i는 9.99999999999998과 같습니다. (저는 Python 3.6을 사용하고 있으며 부동소수점 숫자의 10진수 표현은 가장 짧은 등가 표현을 사용합니다. 또한 C 언어와 동일한 내부 표현을 사용합니다.)
부동소수점 숫자는 컴퓨터에서 이진수 형태로 표현되고 연산되며(보통 IEEE 754 표준 사용), 0.1은 이진수로 정확하게 표현될 수 없습니다. (반복소수점입니다. 분모에 2의 인수만 포함된 소수만 바이너리로 표현됩니다. 그때까지는 순환되지 않습니다.) 이런 식으로 오류가 발생합니다. 오류가 누적되면 십진법에서 점점 더 벗어나게 됩니다.
동일성을 비교해야 하는 경우 지정된 숫자로 차이를 찾을 수 있습니다. 차이가 특정 값(예: Python의
math.isclose
함수)보다 작으면 동일한 것으로 간주됩니다.정확한 값이 필요한 경우(예: 1페니도 적지 않은 재무 계산 수행) 소위 "십진수"를 사용하여 연산을 수행할 수 있습니다(소수점, Python과 Ruby에서 모두 지원됨). 또한 mpdecimal 라이브러리를 사용하거나, 정밀도를 지정하거나(예: mpfr 라이브러리 사용), 고정 소수점 숫자를 사용합니다.
强数据类型
의 언어는double
float
등 소수점으로 데이터를 비교할 때 일반적으로==
를 사용하지 않습니다.대신 두 숫자를 뺀 값의 절대값을 비교합니다. 절대값이 작은 값보다 작으면 두 부동 소수점 숫자가 동일한 것으로 간주합니다.
다음 코드:으아악
이런 일이 발생하는 이유는 컴퓨터 자체가 데이터를 표현하기 위해 01 바이너리를 사용하기 때문입니다.컴퓨터 내부의 부동 소수점 숫자 저장 형식 때문에 메모리에 저장된 많은 부동 소수점 숫자는 최대한 가까운 형태로만 저장됩니다.
관심이 있으시면 자세히 알아보세요.