Thread Probleme mit int ? (4 answers)
Opened by hugenyn at 2012-01-16 21:11

bianca
 2012-01-17 03:14
#155493 #155493
User since
2009-09-13
6978 Artikel
BenutzerIn

user image
2012-01-16T21:22:02 hlubenow
Oder siehst Du einen besonderen Grund, das nicht so zu machen?

Ja, ich sehe mehrere. Mit sprintf allein kann man nicht zuverlässig runden.
Wir haben das in diesem Thread erarbeitet: Kaufmännisch korrekt runden

Am Ende war die Lösung von topeg die zuverlässigste und gegenüber Math::BigFloat auch noch erheblich schneller.

Am Ende kam das hier dabei raus:
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 kfmrunden {
    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;
}


Editiert von bianca: Code ergänzt
Last edited: 2012-01-17 03:54:24 +0100 (CET)
10 print "Hallo"
20 goto 10

View full thread Probleme mit int ?