PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Rechenprobleme mit Perl



Vagabundo
04-01-2012, 16:08
Hallo,

aus dem folgende Perl Befehl, bekomme ich das nachfolgende Ergebnis:


print "Abweichung: OLD: $oldsumme NEWPay: $payamount, NEWUse: $callsumme, Gesamt: ".($payamount+$callsumme)."\n";

Abweichung: OLD: 3.5400 NEWPay: 165.53, NEWUse: -161.99, Gesamt: 3.53999999999999

Ich habe schon gelesen, dass Perl bei sehr grossen Dezimalzahlen Probleme hat. Aber das sind ja nun keine "grossen Zahlen" (bis auf das Ergebnis).

Das Math::BigFloat; scheue ich mich etwas zu verwenden, da ich den Hinweis gelesen habe, dass dadurch erheblich mehr die Rechenleistung benoetigt wird.

Es geht hier um einen taeglichen Durchlauf mit ca 100.000 Berechnungen.
Der Old-Wert zeigt nur als Vergleich an, was vorher in der Datenbank stand.

Aber auch bei gleichen Werten wird eine Abweichung festgestellt:
Abweichung: OLD: 8.1300 NEWPay: 10.00, NEWUse: -1.87, Gesamt: 8.13

Hier ist die Rechnung zwar richtig, aber der Vergleich zwischen
8.1300 == 8.13 ist unwahr.

Danke fuer alle Hinweise.

Vagabundo

reneeb
06-01-2012, 12:03
Hi,

das ist kein Problem von/mit Perl, sondern ein viel allgemeineres. Das hat damit zu tun, wie Zahlen im Rechner abgebildet werden. Solche Probleme treten mit allen Sprachen auf (Man muss nur mal danach suchen: http://duckduckgo.com/?q=floating+point+problem).

Ich würde Dir raten, mittels "sprintf" auf zwei Stellen zu runden:



print "Abweichung: OLD: $oldsumme NEWPay: $payamount, NEWUse: $callsumme, Gesamt: ". sprintf( "%.2f", $payamount+$callsumme)."\n";

mit dem "f" sagst, Du dass es eine Dezimalzahl ist, die ".2" bedeutet, dass es zwei Nachkommastellen sind.