Schrift
[thread]11767[/thread]

Auf 2. Kommastelle runden? (Seite 3)

Leser: 35


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
bianca
 2009-12-11 09:32
#129187 #129187
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-11T08:15:57 renee
Die 0.46 gibt's wohl nicht, die 0.4502 gibt's als "unstable" bei trouchelle und die 0.44 als stable ebenfalls bei trouchelle.

Hab hier ppm 4.02 und eingetragen ist http://trouchelle.com/ppm10/package.xml
Suchbegriff math bringt auch haufenweise Ergebnisse aber kein Math-Currency. Ist der URL falsch?
10 print "Hallo"
20 goto 10
renee
 2009-12-11 09:39
#129188 #129188
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Nein, ich war nur von Perl 5.8.x ausgegangen, nicht von 5.10.x.

Für Perl 5.10.x scheint es das wirklich nicht zu geben...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
bianca
 2009-12-11 09:47
#129189 #129189
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-11T08:39:39 renee
Nein, ich war nur von Perl 5.8.x ausgegangen, nicht von 5.10.x.

Ja, sorry, hatte ich nicht erwähnt.
This is perl, v5.10.0 built for MSWin32-x86-multi-thread

2009-12-11T08:39:39 renee
Für Perl 5.10.x scheint es das wirklich nicht zu geben...

Schade. Hätte ich gern versucht.
10 print "Hallo"
20 goto 10
leo11
 2009-12-11 11:44
#129195 #129195
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Vielleicht kannst du einfach den Sourcecode kopieren. Oder Teile davon. Manchmal ist das so wenig... .
bianca
 2009-12-11 11:50
#129196 #129196
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-11T10:44:49 leo11
Vielleicht kannst du einfach den Sourcecode kopieren. Oder Teile davon. Manchmal ist das so wenig... .


Ist mir zuviel Code. Optimiere lieber meinen eigenen.
10 print "Hallo"
20 goto 10
leo11
 2009-12-11 13:07
#129203 #129203
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Nur damit ich das mal lerne: Würde mir jemand zeigen, wie ich eine Zahl wie 2132343.565 Euro vernüftig mit CPAN:Math::Currency runde? Bei mir werden zwar Tausender-Trenner richtig eingefügt, aber das mit den Nachkommastellen klappt nicht.

Edit: Werd aus der Doku nicht schlau.
Last edited: 2009-12-11 13:13:39 +0100 (CET)
bianca
 2009-12-11 14:10
#129207 #129207
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-11T12:07:30 leo11
Nur damit ich das mal lerne: Würde mir jemand zeigen, wie ich eine Zahl wie 2132343.565 Euro vernüftig mit CPAN:Math::Currency runde? Bei mir werden zwar Tausender-Trenner richtig eingefügt, aber das mit den Nachkommastellen klappt nicht.


Der Satz "Currency math is actually more closely related to integer math than it is to floating point math. All currency values should round to the closest cent or whatever the local equivalent should happen to be." macht auf mich den Eindruck als könne das Teil überhaupt nicht kaufmännisch runden.
10 print "Hallo"
20 goto 10
topeg
 2009-12-11 21:03
#129237 #129237
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
2009-12-11T05:59:55 bianca
2008-05-08T20:55:17 topeg
Alle Ansätze patzen irgendwo.

Dieser hier leider auch, wenn es um kaufmännisches Runden geht. Hab diesen Ansatz hier eine Weile verwendet und bin auf etliche Fehler - insbesondere bei negativen Beträgen gestoßen:

Oha stimmt. Bei anderen Sachen klappt es auch nicht. Seltsam, dass mir das bisher nicht aufgefallen ist...

Also hier die überarbeitete Version:
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
sub round
{
  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+\.?\d*)(?:e([+-]?\d+))?$/;
  $exponent=0 unless defined($exponent);
  $pre='' if(!$pre || $pre ne '-');
  
  # full integer zz with exponent
  my ($l)=$number=~/\.(.+)$/;
  $l=$l?length($l):0;
  $exponent-=$l;
  $number=~y/.//d;

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

Das sollte mit allem klar kommen... hoffe ich mal :-)

EDIT: kleinen Fehler beseitigt.
Last edited: 2009-12-11 21:56:42 +0100 (CET)
bianca
 2009-12-12 09:02
#129246 #129246
User since
2009-09-13
6977 Artikel
BenutzerIn

user image
2009-12-11T20:03:12 topeg
Oha stimmt. Bei anderen Sachen klappt es auch nicht. Seltsam, dass mir das bisher nicht aufgefallen ist...

Also hier die überarbeitete Version:


Die läuft durch meine Testumgebung (siehe http://www.perl-community.de/bat/poard/thread/1436...) jetzt auch noch nicht so ganz geschmeidig durch:

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
'-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
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'-.5678'...................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '-0.568'
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'-.5674'...................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '-0.567'
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'-.5670'...................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '-0.567'
'-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.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
'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.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
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'.5670'....................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '0.567'
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'.5674'....................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '0.567'
Use of uninitialized value in pattern match (m//) at rundentest.pl line 261.
Use of uninitialized value in transliteration (tr///) at rundentest.pl line 264.
Use of uninitialized value in concatenation (.) or string at rundentest.pl line 281.
Argument "e0" isn't numeric in addition (+) at rundentest.pl line 282.
'.5678'....................auf 3 Stelle(n): '0'........................ FEHLER! Erwartet '0.568'
'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


Die erste Zeile Deines Scripts (my $zahl=shift;) ist bei mir Zeile 250, Rest ist 1:1 rüber kopiert.
10 print "Hallo"
20 goto 10
topeg
 2009-12-12 10:37
#129249 #129249
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
die Funktion hatte Probleme wenn man '.123' übergab.
Habe ich korrigiert.
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
sub round
{
  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";
  #$zahl=sprintf("%.${stelle}f",$zahl);
  return $zahl+0;
}
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



View all threads created 2008-05-07 02:31.