Revision b36ef567
Von Moritz Bunkus vor fast 15 Jahren hinzugefügt
SL/Form.pm | ||
---|---|---|
1126 | 1126 |
my ($self, $amount, $places) = @_; |
1127 | 1127 |
my $round_amount; |
1128 | 1128 |
|
1129 |
# Rounding like "Kaufmannsrunden" |
|
1130 |
# Descr. http://de.wikipedia.org/wiki/Rundung |
|
1131 |
# Inspired by
|
|
1132 |
# http://www.perl.com/doc/FAQs/FAQ/oldfaq-html/Q4.13.html
|
|
1133 |
# Solves Bug: 189
|
|
1134 |
# Udo Spallek
|
|
1135 |
$amount = $amount * (10**($places)); |
|
1129 |
# Rounding like "Kaufmannsrunden" (see http://de.wikipedia.org/wiki/Rundung )
|
|
1130 |
|
|
1131 |
# Round amounts to eight places before rounding to the requested
|
|
1132 |
# number of places. This gets rid of errors due to internal floating
|
|
1133 |
# point representation.
|
|
1134 |
$amount = $self->round_amount($amount, 8) if $places < 8;
|
|
1135 |
$amount = $amount * (10**($places));
|
|
1136 | 1136 |
$round_amount = int($amount + .5 * ($amount <=> 0)) / (10**($places)); |
1137 | 1137 |
|
1138 | 1138 |
$main::lxdebug->leave_sub(2); |
Auch abrufbar als: Unified diff
Beim Runden zuerst auf acht Stellen runden, danach auf die gewünschte Anzahl
Die interne Repräsentation von Fließkommazahlen in modernen CPUs ist
immer ungenau. Um zu vermeiden, dass man mit int() zu viel
abschneidet, weil der Nachkommaanteil eben nicht ganz exakt 0 sondern
z.B. 999999999999594 ist, wird zuerst auf acht Stellen gerundet, um
diese Ungenauigkeit zu vermeiden.
Fix für Bug 1115.