Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Rechenprobleme mit Perl

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.11.2006
    Beiträge
    42

    Rechenprobleme mit Perl

    Hallo,

    aus dem folgende Perl Befehl, bekomme ich das nachfolgende Ergebnis:
    Code:
    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    05.02.2006
    Beiträge
    116
    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:

    Code:
    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.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •