Schrift
[thread]11767[/thread]

Auf 2. Kommastelle runden?

Leser: 35


<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten
Gast Gast
 2008-05-07 02:31
#109316 #109316
Naja, es geht einfach darum, dass ich dann z.B.:

print $a/$laenge;


Und jetzt will ich, dass da dann nicht steht: 1,4554876546392
sondern: 1,46

Wie kann man das machen? Da fällt mir nämlich gar nichts ein.
renee
 2008-05-07 11:30
#109326 #109326
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Dazu gibt es sprintf

Code (perl): (dl )
1
2
3
my $lange_zahl = 1.45548765;
my $kurze_zahl = sprintf "%.2f", $lange_zahl;
print $kurze_zahl;


Siehe auch perldoc -f sprintf
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/
lux
 2008-05-08 09:20
#109429 #109429
User since
2007-09-15
104 Artikel
BenutzerIn
[Homepage]
user image
Code (perl): (dl )
print int($a/$laenge*100+0.5)/100;


Gruss

Dirk
Blog - Podcast - Frau - Hunde
Schweizer Tastaturen kennen kein sz.
Dubu
 2008-05-08 15:29
#109435 #109435
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
Runden (von Dezimalbrüchen auf Binärsystemen) ist Glückssache:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ perl -le 'for ($i = 0; $i < 0.101; $i += 0.005) { printf "%f :  %.2f <=> %f\n", $i, $i, int($i*100+0.5)/100};'
0.000000 : 0.00 <=> 0.000000
0.005000 : 0.01 <=> 0.010000
0.010000 : 0.01 <=> 0.010000
0.015000 : 0.01 <=> 0.020000
0.020000 : 0.02 <=> 0.020000
0.025000 : 0.03 <=> 0.030000
0.030000 : 0.03 <=> 0.030000
0.035000 : 0.04 <=> 0.040000
0.040000 : 0.04 <=> 0.040000
0.045000 : 0.04 <=> 0.050000
0.050000 : 0.05 <=> 0.050000
0.055000 : 0.05 <=> 0.050000
0.060000 : 0.06 <=> 0.060000
0.065000 : 0.06 <=> 0.060000
0.070000 : 0.07 <=> 0.070000
0.075000 : 0.07 <=> 0.080000
0.080000 : 0.08 <=> 0.080000
0.085000 : 0.09 <=> 0.090000
0.090000 : 0.09 <=> 0.090000
0.095000 : 0.10 <=> 0.100000
0.100000 : 0.10 <=> 0.100000


perldoc -q floor
topeg
 2008-05-08 22:55
#109467 #109467
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Alle Ansätze patzen irgendwo. Darum hatte ich mir mal eine eigene Funktion geschrieben.

Zum vergleich:
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
#!/usr/bin/perl

use strict;
use warnings;

my $s=2;
for (my $i = 0; $i <= (1/10**($s-1)); $i += (5/10**($s+1)))
{
 printf("%.".($s+1)."f  -->  sprintf:%.$s"."f  <>  round:%s   <>  int:%.$s"."f\n", 
        $i, $i, round($i,$s), int($i*(10**$s)+0.5)/(10**$s) );
}

sub round
{
 my $zahl=shift;
 my $stelle=shift;
 my $zz=$zahl+0;
 if($zz=~/^.+?\.\d{$stelle}/)
 {
  $zz=~s/^.+?\.\d{$stelle}/'0.'.('0'x$stelle)/e;
  $zahl+=$zz;
  $zahl=~s/^(.+?\.\d{$stelle}).*$/$1/;
 }
 $zahl=sprintf("%.$stelle"."f",$zahl);
 return $zahl;
}


Edit: falsche Version genommen, hatte einen Fehler... :-)
tecker
 2008-05-09 12:52
#109478 #109478
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
ganz schön umständlich nur für das runden auf 2 Kommastellen. Wo patzt denn die Variante von renee? Ich mache das genauso.
nepos
 2008-05-09 13:01
#109480 #109480
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Das Problem ist einfach, dass die Zahlen intern in Binärdarstellung gespeichert werden und dort nicht alle Zahlen wirklich darstellbar sind...
renee
 2008-05-09 13:06
#109481 #109481
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
tecker+2008-05-09 10:52:03--
ganz schön umständlich nur für das runden auf 2 Kommastellen. Wo patzt denn die Variante von renee? Ich mache das genauso.


Wo sprintf "patzt" hat Dubu gezeigt. Das hängt aber damit zusammen, dass es beim Speichern von Dezimalzahlen zu Ungenauigkeiten kommt. Durch das %f in Dubus Format wird es leider nicht ganz deutlich. Hier kann man besser erkennen, dass sprintf schon richtig rundet, aber die Dezimalzahlen nicht korrekt gespeichert werden (können) und es somit zu einem falschen Endergebnis kommt:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
C:\>perl -le "for ($i = 0; $i < 0.101; $i += 0.005) { printf qq~%.20f :  %.2f <=> %f\n~, $i, $i, int($i*100+0.5)/100};"
0.00000000000000000000 : 0.00 <=> 0.000000
0.00500000000000000010 : 0.01 <=> 0.010000
0.01000000000000000000 : 0.01 <=> 0.010000
0.01499999999999999900 : 0.01 <=> 0.020000
0.02000000000000000000 : 0.02 <=> 0.020000
0.02500000000000000100 : 0.03 <=> 0.030000
0.03000000000000000200 : 0.03 <=> 0.030000
0.03500000000000000300 : 0.04 <=> 0.040000
0.04000000000000000100 : 0.04 <=> 0.040000
0.04499999999999999800 : 0.04 <=> 0.050000
0.04999999999999999600 : 0.05 <=> 0.050000
0.05499999999999999300 : 0.05 <=> 0.050000
0.05999999999999999100 : 0.06 <=> 0.060000
0.06499999999999998800 : 0.06 <=> 0.060000
0.06999999999999999300 : 0.07 <=> 0.070000
0.07499999999999999700 : 0.07 <=> 0.080000
0.08000000000000000200 : 0.08 <=> 0.080000
0.08500000000000000600 : 0.09 <=> 0.090000
0.09000000000000001100 : 0.09 <=> 0.090000
0.09500000000000001500 : 0.10 <=> 0.100000
0.10000000000000002000 : 0.10 <=> 0.100000
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/
Struppi
 2008-05-09 16:15
#109490 #109490
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Warum gebt ihr denn nicht einfach bei dem Vergleich der beiden Zahlen %.2f an, dann sieht man die Unterschiede vielleicht leichter.
topeg
 2008-05-09 22:45
#109499 #109499
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
0.000  -->  sprintf:0.00  <>  round:0.00  <>  int:0.00
0.005 --> sprintf:0.01 <> round:0.01 <> int:0.01
0.010 --> sprintf:0.01 <> round:0.01 <> int:0.01
0.015 --> sprintf:0.01 <> round:0.02 <> int:0.02 <-- Falsch bei sprintf
0.020 --> sprintf:0.02 <> round:0.02 <> int:0.02
0.025 --> sprintf:0.03 <> round:0.03 <> int:0.03
0.030 --> sprintf:0.03 <> round:0.03 <> int:0.03
0.035 --> sprintf:0.04 <> round:0.04 <> int:0.04
0.040 --> sprintf:0.04 <> round:0.04 <> int:0.04
0.045 --> sprintf:0.04 <> round:0.05 <> int:0.05 <-- Falsch bei sprintf
0.050 --> sprintf:0.05 <> round:0.05 <> int:0.05
0.055 --> sprintf:0.05 <> round:0.06 <> int:0.05 <-- Falsch bei sprintf und int
0.060 --> sprintf:0.06 <> round:0.06 <> int:0.06
0.065 --> sprintf:0.06 <> round:0.07 <> int:0.06 <-- Falsch bei sprintf und int
0.070 --> sprintf:0.07 <> round:0.07 <> int:0.07
0.075 --> sprintf:0.07 <> round:0.08 <> int:0.08 <-- Falsch bei sprintf
0.080 --> sprintf:0.08 <> round:0.08 <> int:0.08
0.085 --> sprintf:0.09 <> round:0.09 <> int:0.09
0.090 --> sprintf:0.09 <> round:0.09 <> int:0.09
0.095 --> sprintf:0.10 <> round:0.10 <> int:0.10
<< |< 1 2 3 4 >| >> 32 Einträge, 4 Seiten



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