Form::round_amount: Perls Wissen über Stringifizierung nutzen
authorMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 30 Sep 2014 15:46:31 +0000 (17:46 +0200)
committerMoritz Bunkus <m.bunkus@linet-services.de>
Tue, 30 Sep 2014 15:46:31 +0000 (17:46 +0200)
commited531c37b5bfda999e40904fe5b7fb248ad9e3a3
tree4069d5765647df3d854d81c87c969acf8154b5f5
parentadd0f69be977025f141c7ddb4803f642980a87a0
Form::round_amount: Perls Wissen über Stringifizierung nutzen

Perl weiß am besten, wann eine nicht ganz exakte Fließkommazahl
eigentlich eine für Menschen sinnvoll lesbare Fließkommazahl ist (also
dass mit 143.19999999999998863132 eigentlich 143.2 gemeint ist, wenn ich
143.2 übergebe). Also nutzen wir diese Tatsache, machen aus der
Fließkommazahl einen String und teilen diesen dann am
Dezimaltrennzeichen auf.

Danach kann mit Integerarithmetik weiter gerechnet werden. Auf die
Nachkommastellen wird entsprechend addiert, sofern die relevante Stelle
>= 5 ist, und der dabei potenziell entstehende Übertrag wird in einer
zweiten Addition auf den Vorkommaanteil addiert.

Erst zum Schluss werden diese beiden Integerzahlen mit Hilfe eines
Strings zu einer Fließkommazahl zusammengesetzt.

Dabei muss beachtet werden, dass auf 32bit-Architekturen Perls
automatische Integer-Umwandlung von Strings bei Stringlängen von 9
bereits auf die wissenschaftliche Schreibweise wechselt. Das wird
verhindert, indem das Math::BigInt-Modul in dem Moment für die
Berechnung verwendet wird, aber aus Performancegründen nur dann, wenn's
wirklich nötig ist.
SL/Form.pm
t/form/round_amount.t