2016-08-03 5 views
-3

누군가 내가 왜 내가 이해하고 싶습니다 166.9 (나는 둥근() 기능이 있다는 것을 알고) 나에게 설명 할 수 있습니까? :)Python3 이상한 부동 소수점 반올림

>>> 165.0 + 1.45 + 0.45 
166.89999999999998 
+6

그건 정말 이상하다 @JonathonReinhart [부동 소수점 연산이 깨진] (http://stackoverflow.com/q/588004/5647260) 내가 한 – Li357

+0

@JonathonReinhart가, 따라서 귀하의 코멘트 – Li357

+0

에 upvotes가, 내 플래그 옵션이 회색으로되어 있기 때문에 그래서 확실하게 중복으로 표시했습니다. – Li357

답변

0

이것은 컴퓨터에서 숫자가 이진 형식으로 표현되기 때문입니다. 이것은 파이썬에서만 문제가 아니지만 일반적으로 컴퓨터에서 발생합니다.

+0

내 2 € calc는이 계산을 처리 할 수 ​​있습니다 ...이 simpe C 프로그램은 정답을 찾습니다. #include int main() { printf ("% f \ n", 165.0 + 1.45 + 0.45); return 0; } – hanoo

+0

예, 자연 스럽습니다. 이 주제에 대한 링크를보십시오. 간단히 말해 계산기는 내부적으로 이진 형식의 숫자를 가지며 내부적으로 표시되는 1.45와 같은 숫자를가집니다. 1.4499999999999999999로 그러나 그는 당신에게 내부 번호를 보여줄 수있는 곳이 그리 많지 않으므로, 반올림하고 전시 1.45에서 당신을 보여줄 것입니다. 그러나 컴퓨터는 메모리 공간이 훨씬 넓어서 둥글지 않아서 바이너리 형식에서 더 큰 정확도를 가지며 필요하지 않은 경우에는 반올림하지 않습니다. 역설적이게도, 값싼 장치는 그 둘레가 더 정확 해 보이지만, 내부적으로는 그렇지 않습니다. –

+0

당신의 예제는 멋지지만''% f \ n "'의 형식은 어떤 의미인지 알아야합니다. 예를 들어이 포맷을''% .30f \ n "'시도하십시오. 소수점은 30 자입니다. 결과 : 166.899999999999977262632455676794입니다. 전체 프로그램 :'#include int main() {printf ("% .30f \ n", 165.0 + 1.45 + 0.45); 0을 반환; }' –

0

부동 소수점 숫자는 파이썬에서 64 비트로 저장됩니다. 1 비트는 부호이고, 가수는 52 비트이고, 지수는 11 비트이다. 이 세 가지 구성 요소에서 십진수 값을 얻으려면 컴퓨터가 * 가수 * 2 지수를 수행합니다.

모든 숫자를이 양식에 완벽하게 저장할 수있는 것은 아닙니다. 번호를 저장하는 데만 52 비트. 예를 들어, 11.3은이 양식에 완벽하게 저장할 수 없으므로 숫자로 정확한 값을 볼 수 있습니다.

from decimal import Decimal 
print(Decimal(11.3)) 

165.0 + 1.45 + 0.45를 추가 할 때.

>>> print(Decimal(165)) 
165 
>>> print(Decimal(1.45)) 
1.4499999999999999555910790149937383830547332763671875 
>>> print(Decimal(0.45)) 
0.450000000000000011102230246251565404236316680908203125 

실제로 이러한 정확한 값을 추가하지 않았습니다.

부동 소수점 시스템에 대한 자세한 내용은 Wikipedia을 참조하십시오.

관련 문제