2012-11-10 17 views
9

Werfen Sie einen Blick auf diese:Python seltsam int Verhalten

print 41063625 ** (1.0/3) # cube-root(41063625) = 345 
print int(345.0) 
print int(41063625 ** (1.0/3)) 

Es gibt:

345.0 
345 
344 

Ich war die letzte Zeile erwartet 345 zu sein, da ich int(41063625 ** (1.0/3)) erwartete, um gleich int(345.0) zu Drehen Sie gleich 345, wie die anderen beiden Ausgänge vorschlagen. Dies ist jedoch offensichtlich nicht der Fall. Kann mir jemand einen Einblick geben, was hier vor sich geht?

Antwort

12

Drucken (oder besser float.__str__) rundet den Ausgang ab.

In [22]: str(41063625 ** (1.0/3)) 
Out[22]: '345.0' 

Die Gleitkommadarstellung für 41063625 ** (1.0/3) weniger als 345, so, wenn Sie die int davon nehmen, erhalten Sie 344 statt 345.

In [15]: 41063625 ** (1.0/3) 
Out[15]: 344.9999999999999 

In [16]: int(345.0) 
Out[16]: 345 

In [17]: int(41063625 ** (1.0/3)) 
Out[17]: 344 

Wenn Sie das nächste int möchten, können Sie verwenden Runde könnte:

In [18]: round(41063625 ** (1.0/3)) 
Out[18]: 345.0 

oder eine int zu erhalten:

In [19]: int(round(41063625 ** (1.0/3))) 
Out[19]: 345 
+0

Ah in Ordnung, das macht Sinn - wusste nicht, dass es eine Eigenschaft von 'print' war, so zu runden. Vielen Dank! – arshajii

+1

Es könnte illustrativ sein, die Ausgabe von 'str (41063625 ** (1.0/3))' zu posten, da das ist, was 'print' tatsächlich druckt. – mgilson

+0

@mgilson: Danke; so hinzugefügt. – unutbu

1

weil 41063625 ** (1.0/3) ist nicht 345.0:

In [7]: 41063625 ** (1.0/3) 
Out[7]: 344.9999999999999 

In [8]: int(344.9999999999999) 
Out[8]: 344 
0

Nun, was ich aus den Berechnungen bekam etwas wie folgt aus:

>>> 41063625 ** (1.0/3) 
344.9999999999999 
>>> int(345.0) 
345 
>>> int(41063625 ** (1.0/3)) 
344 

So 344 bekommen ist absolut richtig. Die interne Darstellung von Gleitkommazahlen ist nicht genau genug, so dass bei int immer der Wert für den Floor angegeben wird.

Sie können die Funktion round() verwenden, um einen vernünftigeren Wert zu erhalten.