2013-08-09 3 views
2

매우 비슷한 코드를 실행하는 두 개의 다른 파이썬 스크립트를 디버깅하려고합니다. 이 스크립트는 간단한 float 인 a을 설정합니다. 스크립트의 경우 1python float formatting weirdness?

:

ipdb> print sys.version 
2.7 (r27:82500, Jul 15 2010, 13:04:38) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] 
ipdb> type(a) 
<type 'float'> 
ipdb> print a 
17.23105 
ipdb> print '{0:.4f}'.format(a) 
17.2311 

스크립트 2의 경우는 :

ipdb> print sys.version 
2.7 (r27:82500, Jul 15 2010, 13:04:38) 
ipdb> print type(a) 
<type 'float'> 
ipdb> print a 
17.23105 
ipdb> print '{0:.4f}'.format(a) 
17.2310 

어떻게 수 있다는 것입니다 a 형식 다른 두 경우에? 두 가지 스크립트간에 어떤 점에서 a이 다를 수 있습니까? 이미 값이 동일하다고 확인한 경우 17.23105? (불행히도 원래 a을 설정하는 파이썬 코드는 매우 길다. 나는 1000 개 이상의 라인을 가진 모든 사람들을 지루하게하고 싶지 않다.)

+0

매번 동일한 값으로'a'를 초기화합니까? 당신은'a'가 어떻게 생성되는지 우리에게 알려주지 않았습니다. 내가 물어 보는 이유는 그들이 약간 다른 입력으로 만들어 졌는지를 알고 싶다. – SethMMorton

+0

'a'는 두 스크립트에서 조금씩 다르게 생성됩니다. 코드를 게시하지 않겠다는 사과를하지만, 실제로 게시하기에는 너무 길다. (나는이 디버깅 정보로 충분하다고 희망했다.) – asf107

답변

5

str float의 표현은 12 자리로 잘린다. 이것은 불행합니다. 당신은 모든 정밀도를 볼 수 있도록 print repr(a)해야합니다. 아마 12 자리 숫자 뒤에 나타나는 작은 차이가있을 것입니다.

+0

와우, 예 ... 스크립트 1은'repr (a)'를' 17.231050000000003 '이고, 스크립트 2는'repr (a)'가'17.23105'입니다.이 두 표현식이'{0 : .4f}'와 다르게 형식화되는 것은 약간 이상합니다 .. – asf107

+0

그래, 두 번째 것은 반올림하기에 충분히 작습니다. (부동 소수점은 바이너리를 사용하기 때문에 두 개의 숫자는 엄밀히 말하면 여러분이 보지 못했던 엄청난 양의 자릿수를 가지고 있습니다; 'print decimal.Decimal (a)'는 Python이'17.23105'와'17.231050000000003'을 근사값으로 사용하고 있음을 보여줍니다.) – user2357112

+1

감사합니다. 저는 정말로 부동 소수점 연산에주의해야합니다. :) – asf107