Thread Auf 2. Kommastelle runden? (31 answers)
Opened by Gast at 2008-05-07 02:31

topeg
 2009-12-11 21:03
#129237 #129237
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2009-12-11T05:59:55 bianca
2008-05-08T20:55:17 topeg
Alle Ansätze patzen irgendwo.

Dieser hier leider auch, wenn es um kaufmännisches Runden geht. Hab diesen Ansatz hier eine Weile verwendet und bin auf etliche Fehler - insbesondere bei negativen Beträgen gestoßen:

Oha stimmt. Bei anderen Sachen klappt es auch nicht. Seltsam, dass mir das bisher nicht aufgefallen ist...

Also hier die überarbeitete Version:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
sub round
{
  my $zahl=shift;
  return undef unless(defined($zahl));
  my $stelle=shift || 0;
  
  # prepare for Xe[+-]Y Notation
  # handle big float
  my ($pre,$number,$exponent)=$zahl=~/^([-+]?)(\d+\.?\d*)(?:e([+-]?\d+))?$/;
  $exponent=0 unless defined($exponent);
  $pre='' if(!$pre || $pre ne '-');
  
  # full integer zz with exponent
  my ($l)=$number=~/\.(.+)$/;
  $l=$l?length($l):0;
  $exponent-=$l;
  $number=~y/.//d;

  # correct position for round
  my $stellen=$stelle+$exponent;
  if($stellen<0)
  {
    $exponent=-$stelle;
    my $add=substr(('0'x abs($stellen)).sprintf("%.0f",$number),$stellen,-$stellen);

    # round...
    $number+=$add;

    $number=('0'x abs($stellen)).sprintf("%.0f",$number);
    substr($number,$stellen,-$stellen,'');
  }
  
  # reconstruct number
  $zahl="$pre${number}e$exponent";
  return $zahl+0;
}

Das sollte mit allem klar kommen... hoffe ich mal :-)

EDIT: kleinen Fehler beseitigt.
Last edited: 2009-12-11 21:56:42 +0100 (CET)

View full thread Auf 2. Kommastelle runden?