Thread Runden *war Subtrahieren in Perl ... (55 answers)
Opened by Muffi at 2013-09-25 10:41

bianca
 2013-09-25 09:07
#170584 #170584
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2013-09-25T06:56:28 Muffi
KAUFMÄNNISCHE RUNDUNG IST MIT FLIESSKOMMAZAHLEN NICHT ZU MACHEN!
Es geht nicht! Glaubs halt endlich.

Und wieso kann man mit Computern trotzdem kaufmännische Anwendungen benutzen?

Ich bin nach wie vor sehr zufrieden mit dieser Lösung:
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
37
38
39
40
41
42
43
sub runden {
    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.]+)(?:e([+-]?\d+))?$/;
    $exponent=0 unless defined($exponent);
    $pre='' if(!$pre || $pre ne '-');

    # full integer number with exponent
    my ($l)=$number=~/\.(.+)$/;
    $exponent-=$l?length($l):0;
    $number=~y/.//d;

    # correct position for round
    my $stellen=$stelle+$exponent;
    if($stellen<0)
    {
    $exponent=-$stelle;
    my $add=substr(('0'x abs($stellen)).$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";

    # format number
    if($zahl==0)
    { $zahl='0'; }
    else
    {
    $zahl=sprintf("%.${stelle}f",$zahl);
    $zahl=~s/\.?0+$// if(index($zahl,'.')>0)
    }
    return $zahl;
}

Entnommen aus: msg #129240 mit bestem Dank an topeg!

Muffi, ich weiß nicht, worauf du da rumreitest aber es gilt ja immer, Lösungen zu finden und nicht Gründe dagegen.
10 print "Hallo"
20 goto 10

View full thread Runden *war Subtrahieren in Perl ...