[Python-de] Python2 auf 3: Matheberechnungen

Peter Otten __peter__ at web.de
Di Aug 18 04:56:25 EDT 2020


Am Di August 18 2020, 08:09:29 schrieb Stephan Seitz:
> Hallo!
> 
> Ich versuche gerade, das völlig unnötige ;-) Python-Script AstroBuild
> (https://github.com/lhartikk/AstroBuild) auf Python3 zu migrieren.
> 
> Dabei stelle ich aber fest, daß die verwendeten mathematischen
> Funktionen teilweise zu anderen Ergebnissen kommen.
> 
> Eine Funktion berechnet z.B. aus Jahr, Monat, Tag und Stunde den folgenden
> Wert:
> return 367*year - 7 * ( year + (month+9)/12 ) / 4 + 275*month/9 + day -
> 730530 + float(hour)/float(24)
> 
> Python2 kommt aktuell auf 7536.33333333, Python3 auf 7535.298611111201.
> Da dieser Wert für weitere Berechnungen verwendet wird, komme ich nie
> auf identische Ergebnisse.
> 
> Woran liegt das? 

In Python 2 kommt es auf den Typ der Operanden an -- bei der Division zweier 
int ist das Ergebnis wieder ein int, in allen anderen Fällen ein float:

# py2
>>> 7/2
3
>>> 7./2
3.5

In Python 3 ist das Ergebniss immer ein float:

# py3
>>> 7/2
3.5


> Und wie portiert man dann so ein Script?

Du musst die Divisionen identifizieren, bei denen sowohl Dividend als auch 
Divisor ganzzahlig sind, und dort den Operator / durch // ersetzen:

# py3 und py2, i. e. die Änderung ist rückwärtskompatibel
>>> 7//2
3

PS: Du kannst das Verhalten von py3 in py2 erzwingen mit

# py2
>>> 7/2
3
>>> from __future__ import division
>>> 7/2
3.5



Mehr Informationen über die Mailingliste python-de