Ich arbeite an einem Buchhaltungsskript, das in Perl geschrieben wurde, und ich frage mich, was die "richtige" Art ist, arithmetische Berechnungen durchzuführen. Zum Beispiel möchte ich sicherstellen, dass Vergleiche wie diese richtig funktionieren:
%Vor% In Python würde ich den Decimal
Typ für die Werte verwenden, aber was mache ich in Perl?
(HINWEIS: Es gibt Math :: Currency , aber momentan ist es defekt.)
Verwenden Sie Math::BigFloat
, um Zahlen als beliebige Präzisionsobjekte darzustellen.
Sie können dies automatisch mit bignum
...
ABER! Die Magie funktioniert nur bei Zahlen . Wenn Sie versuchen, Strings zusammenzufügen, wird es nicht funktionieren, die Magie kommt zu spät. Sie müssen sie explizit zu Zahlen machen. Um eine Zeichenkette zu nummerieren, können Sie der Zeichenkette 0 hinzufügen, zB $a += 0
. Oder Sie können erzwingen, dass eine Gleichung als bignums ausgeführt wird, indem Sie mit 0 +
beginnen und die Zeile entlang kaskadieren.
Zwei Vorbehalte.
Erstens, das alles kostet viel Leistung. Nicht nur, um willkürliche Präzisionsmathematik zu machen, sondern auch für alle Methoden und überladene Magie. Benchmark es um zu sehen, ob dies akzeptabel ist. Glücklicherweise aktualisiert bignum
nur Zahlen in seinem Umfang, nicht das gesamte Programm. Es ist auch sicher, diese Zahlen außerhalb des Bereichs von bignum
zu verwenden. Jede mit ihnen durchgeführte Mathematik wird ebenfalls aktualisiert.
Zweitens: Dezimal bewahrt wichtige Zahlen. Math :: BigFloat wird nicht.
Am besten kann ich testen, ob absolutes Diff weniger als eine Toleranz ist. Zum Beispiel:
perl -e '$ x = 0,1 + 0,1 + 0,1; $ y = 0,3; $ q = abs ($ x - $ y) & lt; 0,0001? "GLEICH": "NICHT GLEICH"; Druck $ q. "\ n"; "