Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision b36ef567

Von Moritz Bunkus vor mehr als 14 Jahren hinzugefügt

  • ID b36ef567192b240f29d22affafcdcd985db1d392
  • Vorgänger f11dcc70
  • Nachfolger 8579b570

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.

Unterschiede anzeigen:

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