Thread Kaufmännisch korrekt runden (67 answers)
Opened by bianca at 2009-12-11 07:14

bianca
 2009-12-11 11:31
#129194 #129194
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
2009-12-11T09:47:58 Dubu
(0.005,2) => 0.1?

Erwischt! Mist.

Korrektur, geht aber bestimmt eleganter, oder?

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
44
45
46
47
48
49
50
51
52
sub kfmrunden {
        #
        # Aufruf:
        # =======
        # my $gerundet = &kfmrunden([wert],[stellen]);
        # [wert]                = Nur nummerische Werte! Keine Extremwerte wie z.B. 1e+100 oder 4.24306121591708e-007! Kein Komma, kein Tausenderpunkt etc.
        # [stellen]             = Anzahl gewünschte Nachkommastellen, zwischen 0 und 9 zulässig
        #
        my $wert = shift (@_) || 0;
        my $stellen = shift (@_) || 0;
        my $vorzeichen = '';
        my $vorkomma = 0;
        my $nachkomma = '';
        if ($stellen >= 0 && $stellen <= 9 && !($wert =~ /[^+-\.0-9]/)) {
                if (substr ($wert,0,1) eq '-' || substr ($wert,0,1) eq '+') {
                        $vorzeichen = '-' if substr ($wert,0,1) eq '-';
                        $wert = substr ($wert,1);
                }
                ($vorkomma,$nachkomma) = split /\./,$wert;
                $vorkomma = 0 unless $vorkomma;
                $nachkomma = '' unless $nachkomma;
                if (length ($nachkomma) > $stellen) {
                        my $auf = (substr ($nachkomma,$stellen,1) > 4 ? 1 : 0);
                        if (!$stellen) {
                                $vorkomma ++ if $auf;
                                $nachkomma = '';
                        }
                        else {
                                if ($auf) {
                                        my $vornull = 0;
                                        for (my $z = 0; $z < $stellen; $z ++) {
                                                last if substr ($nachkomma,$z,1) ne '0';
                                                $vornull ++;
                                        }
                                        if (substr ($nachkomma,0,$stellen) eq '9' x $stellen) {
                                                $vorkomma ++;
                                                $nachkomma = '';
                                        }
                                        else {
                                                $vornull -- if substr ($nachkomma,$stellen - 1,1) eq '0';
                                                my $temp = substr ($nachkomma,0,$stellen) + 1;
                                                $nachkomma = ($vornull ? '0' x $vornull : '') . $temp;
                                        }
                                }
                                else {
                                        $nachkomma = substr ($nachkomma,0,$stellen);
                                }
                        }
                }
        }
        return ("$vorkomma.$nachkomma" / 1 ? $vorzeichen : '') . "$vorkomma" . ($nachkomma ne '' && substr ($nachkomma,0,$stellen) ne '0' x $stellen ? ".$nachkomma" : '');
}


EDIT: Code nochmal angepaßt, 0.00 und -0.0 als Ergebnisse rausgenommen.
Last edited: 2009-12-11 11:42:02 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Kaufmännisch korrekt runden