2009-12-12T00:40:51
topegUm 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:
1
2
3
4
5
6
7
8
9
10
11
12
sub kfmrunden {
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:
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