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

bianca
 2009-12-12 09:13
#129247 #129247
User since
2009-09-13
6975 Artikel
BenutzerIn

user image
2009-12-12T00:40:51 topeg
Um das etwas zu illustrieren:

Das ist merkwürdig.
Mit 0.055 auf 2 Stellen hat bei mir weder die pq- noch Deine noch meine Lösung ein Problem.
Ist das bei Dir vielleicht wegen sprintf() falsch?

Ich bin mit dem Vorschlag von pq äußerst zufrieden. Ist kurz, schnell und zuverlässig. So hab ich den aktuell implementiert:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub kfmrunden {
        #
        # Aufruf:
        # =======
        # my $gerundet = &kfmrunden ([wert],[stellen]);
        # [wert]                = Nur nummerische Werte! Kein Komma, kein Tausenderpunkt etc.
        # [stellen]             = Anzahl gewünschte Nachkommastellen, Werte >= 0 zulässig
        #
        my $num = shift (@_) || 0;
        my $stellen = shift (@_) || 0;
        return int ($num * (10 ** $stellen) + ($num < 0 ? -0.5 : 0.5) ) / 10 ** $stellen;
}


Und die Testumgebung sagt dazu:

Code: (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
'-999999999999.999'........auf 2 Stelle(n): '-1000000000000'........... OK
'-999999999999.994'........auf 2 Stelle(n): '-999999999999.99'......... OK
'-2132343.565'.............auf 2 Stelle(n): '-2132343.57'.............. OK
'-12345.35'................auf 1 Stelle(n): '-12345.4'................. OK
'-12345.34'................auf 1 Stelle(n): '-12345.3'................. OK
'-456.5'...................auf 0 Stelle(n): '-457'..................... OK
'-456.4'...................auf 0 Stelle(n): '-456'..................... OK
'-57'......................auf 2 Stelle(n): '-57'...................... OK
'-00000034.999'............auf 2 Stelle(n): '-35'...................... OK
'-12.2345678905'...........auf 9 Stelle(n): '-12.234567891'............ OK
'-9.999'...................auf 3 Stelle(n): '-9.999'................... OK
'-9.999'...................auf 0 Stelle(n): '-10'...................... OK
'-9.999'...................auf 1 Stelle(n): '-10'...................... OK
'-9.999'...................auf 2 Stelle(n): '-10'...................... OK
'-8.9964'..................auf 2 Stelle(n): '-9'....................... OK
'-8.9964'..................auf 0 Stelle(n): '-9'....................... OK
'-8.9964'..................auf 1 Stelle(n): '-9'....................... OK
'-1.9'.....................auf 0 Stelle(n): '-2'....................... OK
'-1.455'...................auf 2 Stelle(n): '-1.46'.................... OK
'-1.295'...................auf 2 Stelle(n): '-1.3'..................... OK
'-1'.......................auf 2 Stelle(n): '-1'....................... OK
'-0.999999999'.............auf 0 Stelle(n): '-1'....................... OK
'-.5678'...................auf 3 Stelle(n): '-0.568'................... OK
'-.5674'...................auf 3 Stelle(n): '-0.567'................... OK
'-.5670'...................auf 3 Stelle(n): '-0.567'................... OK
'-0.5'.....................auf 0 Stelle(n): '-1'....................... OK
'-0.49999999'..............auf 0 Stelle(n): '0'........................ OK
'-0.2225000000'............auf 3 Stelle(n): '-0.223'................... OK
'-0.2224000000'............auf 3 Stelle(n): '-0.222'................... OK
'-0.105'...................auf 2 Stelle(n): '-0.11'.................... OK
'-0.1005'..................auf 3 Stelle(n): '-0.101'................... OK
'-0.055'...................auf 2 Stelle(n): '-0.06'.................... OK
'-0.05499999999999999334'..auf 2 Stelle(n): '-0.05'.................... OK
'-0.05499999999999999334'..auf 3 Stelle(n): '-0.055'................... OK
'-0.05'....................auf 1 Stelle(n): '-0.1'..................... OK
'-0.04'....................auf 1 Stelle(n): '0'........................ OK
'-0.0105'..................auf 3 Stelle(n): '-0.011'................... OK
'-0.005'...................auf 2 Stelle(n): '-0.01'.................... OK
'-0.004'...................auf 2 Stelle(n): '0'........................ OK
'-0.0000000075'............auf 9 Stelle(n): '-7e-009'.................. FEHLER! Erwartet '-0.000000008'
'0.0000000075'.............auf 9 Stelle(n): '7e-009'................... FEHLER! Erwartet '0.000000008'
'4.24306121591708e-007'....auf 2 Stelle(n): '0'........................ OK
'0.004'....................auf 2 Stelle(n): '0'........................ OK
'0.005'....................auf 2 Stelle(n): '0.01'..................... OK
'0.0105'...................auf 3 Stelle(n): '0.011'.................... OK
'0.04'.....................auf 1 Stelle(n): '0'........................ OK
'0.05'.....................auf 1 Stelle(n): '0.1'...................... OK
'0.05499999999999999334'...auf 2 Stelle(n): '0.05'..................... OK
'0.05499999999999999334'...auf 3 Stelle(n): '0.055'.................... OK
'0.055'....................auf 2 Stelle(n): '0.06'..................... OK
'0.1005'...................auf 3 Stelle(n): '0.101'.................... OK
'0.105'....................auf 2 Stelle(n): '0.11'..................... OK
'0.2224000000'.............auf 3 Stelle(n): '0.222'.................... OK
'0.2225000000'.............auf 3 Stelle(n): '0.223'.................... OK
'0.49999999'...............auf 0 Stelle(n): '0'........................ OK
'0.5'......................auf 0 Stelle(n): '1'........................ OK
'.5670'....................auf 3 Stelle(n): '0.567'.................... OK
'.5674'....................auf 3 Stelle(n): '0.567'.................... OK
'.5678'....................auf 3 Stelle(n): '0.568'.................... OK
'0.999999999'..............auf 0 Stelle(n): '1'........................ OK
'1'........................auf 2 Stelle(n): '1'........................ OK
'1.295'....................auf 2 Stelle(n): '1.3'...................... OK
'1.455'....................auf 2 Stelle(n): '1.46'..................... OK
'1.9'......................auf 0 Stelle(n): '2'........................ OK
'8.9964'...................auf 1 Stelle(n): '9'........................ OK
'8.9964'...................auf 0 Stelle(n): '9'........................ OK
'8.9964'...................auf 2 Stelle(n): '9'........................ OK
'9.999'....................auf 3 Stelle(n): '9.999'.................... OK
'9.999'....................auf 2 Stelle(n): '10'....................... OK
'9.999'....................auf 1 Stelle(n): '10'....................... OK
'9.999'....................auf 0 Stelle(n): '10'....................... OK
'12.2345678905'............auf 9 Stelle(n): '12.234567891'............. OK
'00000034.999'.............auf 2 Stelle(n): '35'....................... OK
'57'.......................auf 2 Stelle(n): '57'....................... OK
'456.4'....................auf 0 Stelle(n): '456'...................... OK
'456.5'....................auf 0 Stelle(n): '457'...................... OK
'12345.34'.................auf 1 Stelle(n): '12345.3'.................. OK
'12345.35'.................auf 1 Stelle(n): '12345.4'.................. OK
'2132343.565'..............auf 2 Stelle(n): '2132343.57'............... OK
'999999999999.994'.........auf 2 Stelle(n): '999999999999.99'.......... OK
'999999999999.999'.........auf 2 Stelle(n): '1000000000000'............ OK
'1e+100'...................auf 3 Stelle(n): '1e+100'................... OK
(7.56*1.19)................auf 2 Stellen : '9'........................ OK
(-7.56*1.19)...............auf 2 Stellen : '-9'....................... OK
(.57*100)..................auf 0 Stellen : '57'....................... OK
(.57*100)..................auf 2 Stellen : '57'....................... OK


Und auf '0.0000000075' kann ich verzichten, solche Werte kommen in meiner Umgebung nicht vor. Mal abgesehen davon, dass die Rückgabe vielleicht nicht die erwartete aber trotzdem wahrscheinlich die richtige anders dargestellt ist.
10 print "Hallo"
20 goto 10

View full thread Kaufmännisch korrekt runden