Leser: 1
9 Einträge, 1 Seite |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
sub to_three_sig_digits { my $val = shift; if ($val =~ /^(0\.0*)(\d+)$/) { my $pre = $1; my $app = $2; return $val if length($app) <= 3; my $digits = substr($app, 0, 3); my $fourth = substr($app, 3, 1); $digits += 1 if $fourth >= 5; $val = $pre . $digits; } elsif ($val > 1) { $val = sprintf("%.2f", $val); } return $val; }
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
#!/usr/bin/perl use strict; use warnings; my $signifikant=3; my $z="10.000000128536"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="10.000001117885000001100000"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="0.000000195675"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="0.1000000195675"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.1399999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.00099999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.00090000019999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1000.99999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="1099.99999"; print "$z --> ".round_significant($z,$signifikant)."\n"; $z="9999.9999999"; print "$z --> ".round_significant($z,$signifikant)."\n"; ########################################################## ########################################################## sub round_significant { my $zahl=shift; my $stelle=shift; if(my ($zv,$zn) = $zahl =~/^([\d\.]+0)([1-9]{$stelle})\d*?$/) { $zv.="0"x$stelle; $zn++; my $l=length($zn); substr($zv,-1*$l,$l,$zn); $stelle--; $zv=~s/(\.\d{$stelle,}[1-9]+)0+$/$1/; $zahl=$zv; } else { $zahl= sprintf("%.${stelle}f",$zahl); } return $zahl; }
Ronnie+2008-09-24 23:29:12--Etwas umständlich, aber es tut erstmal:
Code (perl): (dl )1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16sub to_three_sig_digits { my $val = shift; if ($val =~ /^(0\.0*)(\d+)$/) { my $pre = $1; my $app = $2; return $val if length($app) <= 3; my $digits = substr($app, 0, 3); my $fourth = substr($app, 3, 1); $digits += 1 if $fourth >= 5; $val = $pre . $digits; } elsif ($val > 1) { $val = sprintf("%.2f", $val); } return $val; }
betterworld+2008-09-25 23:39:43--Das rundet mir jetzt 0.9999 zu 0.1000, das erscheint mir falsch.
betterworld+2008-09-25 23:39:43--Dass Du fuer Werte, die größer als 1 sind, immer auf zwei Nachkommastellen (also nicht nur zwei relevante Stellen) runden willst, wusste ich nicht. Aber ansonsten wuerde ich gerne fragen, was gegen meine (einfachere) Lösung von oben spricht.
Ronnie+2008-09-26 00:47:00--Allerdings ist mir im Moment auch nicht klar wie sie funktioniert?!
9 Einträge, 1 Seite |