[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