PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Perl abs($x) will nicht



BenNavis
28-10-2005, 16:32
Hallo,


$test = 1.99;
$test = abs($test);
print $test;
liefert: 1.99

Ich hätte aber gern 1 raus! ;)


$test = 1.99;
$test = sqrt($test);
print $test;
liefert: 1.41067359796659, sqrt funktioniert also.

Was ist da los?

Ben

RapidMax
28-10-2005, 17:43
$test = sprintf("%.0f", $test);

sub round {
my $n = shift;
return int($n + .5 * ($n <=> 0));
}
Weitere Möglichkeit: Math::Round aus CPAN.

Auf und Abrunden mittels POSIX::floor und POSIX::ceil.

Gruss, Andy

PS: abs() liefert den absoluten Wert zurück, d.h. 1 bei (-1).
PPS: Das ist z.B. einer der Gründe warum mir Perl nicht passt

Molaf
28-10-2005, 19:35
int($a) ist die Lösung.

michael.sprick
28-10-2005, 23:22
PS: abs() liefert den absoluten Wert zurück, d.h. 1 bei (-1).
PPS: Das ist z.B. einer der Gründe warum mir Perl nicht passt
Hä? Perl passt dir nicht, weil abs() den Absolutwert einer Zahl liefert? Hab ich das jetzt richtig verstanden? :D
Was hättest Du denn von abs() erwartet? Oder anders, in welcher Sprache liefert abs() immer eine Ganzzahl?

Oder hab ich was falsch verstanden?

Gruß, Michael

Molaf
29-10-2005, 08:05
Gesucht war wohl eine Funktion zum Abrunden, benutzt wurde aber fälschlicherweise die Funktion zum positiven Grundwert (Absolutwert).

Zumindest habe ich es so gedeutet.

BenNavis
29-10-2005, 09:43
Ach so, abs(x) ist also "Betrag von x"?

Wieder was dazu gelernt! ;)

danke,
Ben

michael.sprick
29-10-2005, 09:58
im Zweifelsfall hilft immer ein


perldoc -f abs


;)

BenNavis
29-10-2005, 10:22
Eine Frage hätte ich noch.

Ich möchte Sekunden in Minuten und Sekunden umrechnen.
Ich teile die Sekunden durch 60 und wende int(x) an, dann habe ich die Minuten.
Ich berechne Sekunden modulo 60 und habe die Sekunden.

Das Problem ist: 5:06 wird dann als 5:6 dargestellt.
Kann man irgendwie sagen, dass Perl bei einstelligen Sekunden immer eine Null vorwegstellen soll?

Danke,
Ben

michael.sprick
29-10-2005, 10:32
$var = sprintf("%02d",$var);

macht aus $var = 2: 02
macht aus $var = 23: 23

sprintf() liefert den formatierten Wert als L-Value zurück.
printf() hingegen gibt den formatierten Wert auf STDOUT aus.

BenNavis
29-10-2005, 13:22
Genau das ist es, ich danke Dir!

Ben

Molaf
30-10-2005, 09:39
Ersatzweise geht auch noch:

if ($sek < 10) { $sek = "0$sek"; }