2013-09-23 3 views
3

나는이 간단한 코드와 사전 만드는거야 :수레 인쇄 - 파이썬

pixel_histogram = {} 
min_value = -0.2 
max_value = 0.2 
interval_size = (math.fabs(min_value) + math.fabs(max_value))/bins 

for i in range(bins): 
    key = min_value+(i*interval_size) 
    print key 
    pixel_histogram[key] = 0 
    print pixel_histogram 

을하지만 내 인쇄로이 값을 가지고 원인 내가 '조금 놀랐어요 :

#Printing keys 
-0.2 
-0.16 
-0.12 
-0.08 
-0.04 
0.0 
0.04 
0.08 
0.12 
0.16 

#Printing the dictionary 
{0.0: 0, 
-0.08000000000000002: 0, 
0.15999999999999998: 0, 
-0.16: 0, 
0.12: 0, 
-0.12000000000000001: 0, 
0.08000000000000002: 0, 
-0.04000000000000001: 0, 
-0.2: 0, 
0.03999999999999998: 0} 

값이 다른 이유와 해결 방법을 알지 못했습니다. 도움이 될 것입니다. 감사합니다. .

+6

[모든 부동 소수점 연산에 대해 알아야 할 모든 컴퓨터 과학자] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html) –

+1

정확한 부동 소수점 연산을 사용해야하는 경우, decimal 클래스 (http://docs.python.org/2/library/decimal.html)를 사용해보십시오. –

+3

두 번째 경우의 출력을 설명하지만 첫 번째 출력이 두 번째 출력과 다른 이유는 설명하지 않습니다. – delnan

답변

7

파이썬의 print 문은 인쇄 할 항목에 str()을 사용합니다. 부동 소수점 값의 경우 str()은 특정 수의 10 진수 값까지 인쇄합니다.

사전을 인쇄 할 때 print 문은 사전 개체에서 str()을 호출합니다. 사전의 __str__() 메서드 정의에서 키에 repr()을 사용합니다. 부동 소수점 값에 대한 repr() 함수는 str() 함수보다 소수 자릿수를 더 많이 인쇄합니다.

사전에 repr()을 사용하고 키를 str()이 아닌 이유는 거의 확실하게 print {'1': 1}의 인쇄물을 print {1: 1}과 다르게보고 싶다는 것입니다.

+0

감사합니다 @ Alok--. 이것은 제가 알고 싶은 것입니다. 죄송합니다 멍청한 질문에 대한, 나는이'print' 방법에 대해 파이썬에서 몰랐다. – pceccon

+0

@pceccon 문제가 없습니다. 즉 당신이 키에 대한 정확한 비교를 할 수 있도록하려는 것을 의미하기 때문에 제쳐두고, 그것은 정말 사전의 키와 같은 부동 소수점 값을 저장하는 것은 좋은 생각이 아니다. (당신이 사전에 키가 부동 소수점 값을 정확하게 표현할 수있는 당신이 가고있는 값을 사용하는 것으로 알고 있다면, 그것은 확인을해야합니다.) –

-3

값은 같습니다. 첫 번째 경우에는 소수 자리로 잘 렸거나 반올림되었습니다. 확실히 숫자의 반올림에 익숙하십니까?

+0

그 코드에서 숫자는 반올림됩니까? – delnan

+4

-1 : 이것은 도움이되지 않는 대답입니다. 문제의 근원을 설명하지는 않습니다. –

+0

@WaleedKhan 예. 문제의 근본 원인은 숫자가 반올림된다는 것입니다. – Marcin