Seite 1 von 1

Seltsame Rechnung

Verfasst: Freitag 12. März 2010, 14:54
von NedNederlander
Hallo miteinander.
Ich habe eben nach längerer Suche im Code einen seltsamen Fehler gefunden.

Code: Alles auswählen

Es geht um volgenden Code-Ausschnitt:

summand_2 = (AnzahlNachrichten / GewichtN)

print "AnzahlNachrichten"
print AnzahlNachrichten

print "GewichtN"
print GewichtN

print "summand_2"
print summand_2

die rechnung sollte doch den wert "AnzahlNachrichten teilen durch "GewichtN".

die ausgabe dieses codes lautet beispielhaft:

Code: Alles auswählen

AnzahlNachrichten
55

GewichtN
5401

summand_2
0

Die Variable summand_2 ergibt imemr 0, auch wenn der Wert von "AnzahlNachrichten" wesentlich höher ist.
Ich kann mir leider nicht erklären, wieso die Rechnung "0" ergibt. Ist das irgend eine Art Rundungsfehler?


bin für Hilfe sehr dankbar!

Verfasst: Freitag 12. März 2010, 14:57
von nemomuk

Code: Alles auswählen

In [13]: 55/5401
Out[13]: 0

In [14]: 55/5401.0
Out[14]: 0.010183299389002037

In [15]: 55/float(5401)
Out[15]: 0.010183299389002037

Verfasst: Freitag 12. März 2010, 15:03
von martin101986
Hallo,

das ist kein Rundungsfehler. Das ist das normale Verhalten von Python bei der Division von Ganzahlen.

Damit du den richtigen Wert erhälst musst einen Wert in ein float umwandeln oder von __future__ division importieren.

Code: Alles auswählen

result = float(55) / 5401
print result

#oder

from __future__ import division
result = 55 / 5401
print result

Grüße Martin

Verfasst: Freitag 12. März 2010, 15:04
von numerix
Ergänzend zu den Zahlen:
Vor Python 3 liefert der "/"-Operator bei Division von zwei Ganzzahlen nur den ganzzahligen Teil ohne einen evtl. Rest; ist mind. einer der Operanden eine Fließkommazahl, dann wird "richtig" dividiert.

Ab Python 3 ist das anders; da liefert eine Division mittels "/" immer einen Fließkommawert. Will man definitiv nur den ganzzahligen Wert, verwendet man den "//"-Operator. Das kannst du übrigens auch bei Python 2 tun und ist gewiss keine schlechte Angewohnheit.

Verfasst: Freitag 12. März 2010, 15:05
von NedNederlander
vielen herzlichen dank!