Marko Schilde: Mathematik in Perl

Hi,

Wie kann man in Perl numerische Variablen runden? Gibt es dazu eine einfache Funktion, oder muss ich den Wert [z.B. $1 = ($2/$3);] wirklich umständlich mit split aufspalten und die Nachkommastelle mühsam auswerten? [<--- seufz *schondasschlimmstebefürcht*]

-M

  1. Hi,

    Wie kann man in Perl numerische Variablen runden? Gibt es dazu eine einfache Funktion, oder muss ich den Wert [z.B. $1 = ($2/$3);] wirklich umständlich mit split aufspalten und die Nachkommastelle mühsam auswerten? [<--- seufz *schondasschlimmstebefürcht*]

    -M

    Hallo,
    da gibt es die "int" - Funktion:
    Zitat aus SELFHTML:

    "Mit int erzwingen Sie von einer Bruchzahl den ganzzahligen Anteil, also bei 3.1415 etwa die Zahl 3. Übergeben Sie der Funktion die Zahl, aus der der Kommawert entfernt werden soll. Die Funktion gibt das Ergebnis zurück."

    Die Syntax sieht dann so aus:
    $rund = int ($krumm);

    Probiers einfach mal aus
    Viele Grüße, Rolf

    1. Hallo Rolf,

      da gibt es die "int" - Funktion:

      Um kaufmaennisch zu runden, braucht man allerdings noch einen kleinen Trick. Man muss 0.5 zur Zahl dazuzaehlen. Beispiel:

      $Zahl1 = 5.43;
      $Zahl2 = 5.63;
      $Vollzahl1 = int(&Zahl1 + 0.5);
      $Vollzahl2 = int(&Zahl2 + 0.5);

      viele Gruesse
        Stefan Muenz

      1. Hallo Rolf,

        Um kaufmaennisch zu runden, braucht man allerdings noch einen kleinen Trick. Man muss 0.5 zur Zahl dazuzaehlen. Beispiel:

        $Zahl1 = 5.43;
        $Zahl2 = 5.63;
        $Vollzahl1 = int(&Zahl1 + 0.5);
        $Vollzahl2 = int(&Zahl2 + 0.5);

        viele Gruesse
          Stefan Muenz

        Hallo Stefan,
        vielen Dank für die Ergänzung.
        Herzliche Grüße aus Erfurt.
        Allen auch ein schönes Wochenende!
        Rolf

    2. hi!

      Wie kann man in Perl numerische Variablen runden?
      Die Syntax sieht dann so aus:
      $rund = int ($krumm);

      Das schneidet allerdings nur die Nachkommastellen ab. Richtig Runden kann man damit nicht. Für die Ausgabe zumindest kann man folgendermaßen runden:
        printf("%.3f", 3.1415926535);   # gibt 3,141 zurück
      Das wird allerdings wohl nicht funktionieren, um Skalaren gerundete Werte zuzuweisen - oder ich weiß nicht, wie das funktioniert. Für weitere Informationen zum Runden siehe perlfaq4:
      ftp://ftp.uni-erlangen.de/pub/source/CPAN/doc/FAQs/FAQ/PerlFAQ.html#Does_perl_have_a_round_function_

      bye, Frank!

      1. hi!

        Wie kann man in Perl numerische Variablen runden?
        Die Syntax sieht dann so aus:
        $rund = int ($krumm);

        Das schneidet allerdings nur die Nachkommastellen ab. Richtig Runden kann man damit nicht. Für die Ausgabe zumindest kann man folgendermaßen runden:
          printf("%.3f", 3.1415926535);   # gibt 3,141 zurück
        Das wird allerdings wohl nicht funktionieren, um Skalaren gerundete Werte zuzuweisen - oder ich weiß nicht, wie das funktioniert. Für weitere Informationen zum Runden siehe perlfaq4:

        sprintf wäre hier die richtige Funktion! Mit ihr wird halt ein entsprechender Skalar erzeugt, der
        dann auch weiterverarbeitet werden kann ...

        $rund = sprintf("%.$nachkommastellen", $krumm);

        ciao,
           Jörk

        1. hi!

          printf("%.3f", 3.1415926535);   # gibt 3,141 zurück
          sprintf wäre hier die richtige Funktion! Mit ihr wird halt ein entsprechender Skalar erzeugt, der
          dann auch weiterverarbeitet werden kann ...
          $rund = sprintf("%.$nachkommastellen", $krumm);

          Was ist, wenn ich mehrere so gerundete Zahlen erzeuge? Wird dann eine Liste zurückgegeben?

          bye, Frank!

          1. Hallo Frank!

            sprintf wäre hier die richtige Funktion! Mit ihr wird halt ein entsprechender Skalar erzeugt, der
            dann auch weiterverarbeitet werden kann ...
            $rund = sprintf("%.$nachkommastellen", $krumm);

            Hier erstmal ein kurzer Fehlerhinweis: leider habe ich das "f" für Fließkommazahlen vergessen:
            $rund = sprintf("%.${nachkommastellen}f", $krumm);

            Was ist, wenn ich mehrere so gerundete Zahlen erzeuge? Wird dann eine Liste zurückgegeben?

            Ich verstehe Dein "wenn" leider nicht so ganz (eindeutig) ...

            sprintf erzeugt einen einzigen String! Der erste Parameter gibt dabei das Format bzw. die Vorlage
            für den String an ("Die bestellten %d Stück kosten %.2f DM"). Dort können mehrere Platzhalter enthalten
            sein. Die folgenden Parameter geben dann die Werte an, die für die Platzhalter eingesetzt werden
            sollen. Hier also $stueck und $preis ...
            sprintf ("Die bestellten %d Stück kosten %.2f DM", $stueck, $einzelpreis * $stueck)

            Mehrere Zahlen zur Rundung an sprintf zu Übergeben macht also so keinen Sinn.

            Um auf diesem Wege mehrere Zahlen zu Runden, hast Du natürlich die Möglichkeit,
            die Anweisung mehrfach hintereinander auzuführen:
            $rund1 = sprintf("%.${nachkommastellen}f", $krumm1);
            $rund2 = sprintf("%.${nachkommastellen}f", $krumm2);
            $rund3 = sprintf("%.${nachkommastellen}f", $krumm3);

            Oder aber du gehst von einer Liste aus (die auch spontan erzeugt werden kann) und wendest dann die sprintf Funktion auf jedes einzelne Element an:

            @rund = ();
            foreach $krumm (@krumm) {
                my $rund = sprintf("%.${nachkommastellen}f", $krumm);
                push( @rund, $rund );
            }

            Bzw.:
            @rund = ();
            foreach $krumm (@krumm) {
                push( @rund, sprintf("%.${nachkommastellen}f", $krumm) );
            }

            Oder (langsam wird's grausig)
            @rund = ();
            for (@krumm) { push( @rund, sprintf("%.${nachkommastellen}f", $_) ); }

            Am perligsten ist aber die Anwendung von MAP.
            @rund = map {sprintf("%.${nachkommastellen}f", $_) } @krumm;

            Gruß,
               Jörk

            1. hi!

              Was ist, wenn ich mehrere so gerundete Zahlen erzeuge? Wird dann eine Liste zurückgegeben?
              Ich verstehe Dein "wenn" leider nicht so ganz (eindeutig) ...

              Sorry, das war wohl ein wenig verwirrend. sprintf liefert einfach den String zurück, den es ausgibt.

              Oder (langsam wird's grausig)
              @rund = ();
              for (@krumm) { push( @rund, sprintf("%.${nachkommastellen}f", $_) ); }

              Naja, ganz so schlimm ist es nun auch nicht. Dinge solcher Art verwende ich normalerweise fast immer :-)

              bye, Frank!