Tom: Auf- und abrunden

Beitrag lesen

Hallo Hirl

Das ist doch in Perl kein Problem ...

... dachte ich, bis ich im Perl-Manual nach der Round-Funktion suchte und diese nicht fand. :-((

Nun habe ich eine solche Funktion mal selbst programmiert und stelle Sie hier zur freien Verfügung:

Funktion zum Runden in Perl

sub round
{
    my $value = shift;          # Wert, der gerundet werden soll
    my $precision = int(shift); # Anzahl Stellen nach dem Komma, auf die gerundet werden soll. Muss eine Ganzzahl sein.
                                # Positive Ganzahlen stellen die Stellen hinter dem Komma dar,
                                # negative Ganzzahlen die Anzahl der signifikanten Stellen vor dem Komma.

# Speichert das Vorzeichen und setzt value auf den Absolutwert.
    my $sign = 1;
    if($value < 0)
        { $sign = -1; }
    $value = abs($value);

# Berrechnet den Genauigkeitsfaktor
    my $pFactor = 10 ** $precision;
    
    # Rundet den Wert
    $value = int(($value * $pFactor) + 0.5) / $pFactor;
    
    # Berücksichtigt das ursprüngliche Vorzeichen
    $value *= $sign;
    
    return $value;
}

Hier der Output eines Test-Skript für diese Round-Funktion:

Testausgabe der Funktion round(value,precision):

Runden auf Ganzahl (precision=0):
round(0.5,0) = 1
round(0.51,0) = 1
round(0.49,0) = 0
round(-0.5,0) = -1
round(-0.6,0) = -1
round(-0.4,0) = 0
round(0.0,0) = 0
round(25.34,0) = 25
round(-36.82,0) = -37

Runden auf Nachkommastellen (precision>0):
round(0.453852,1) = 0.5
round(0.453852,2) = 0.45
round(0.453852,3) = 0.454
round(0.453852,4) = 0.4539
round(0.453852,5) = 0.45385
round(-15.2853,2) = -15.29
round(2546.0127,1) = 2546
round(0.758,5) = 0.758
-> Beachte: fehlende Stellen nach dem Komma werden NICHT mit '0' aufgefüllt. Dazu müssen die sprint()- und sprintf()-Funktionen verwendet werden.

Runden auf signifikante Stellen vor dem Komma (precision<0):
round(28457,-1) = 28460
round(28457,-2) = 28500
round(28457,-3) = 28000
round(28457,-4) = 30000
round(-1473.25,-2) = -1500
round(28457.035,-8) = 0
-> Beachte: Das Runden auf mehr Stellen vor dem Komma als der Wert selber aufweist, führt zum Ergebnis '0'.
Vielleicht finde ich noch ein Workaround, um dieses Problem elegant zu lösen.

Ich hoffe, damit ein kleines Problem gelöst zu haben.

Grüsse
Tom

PS an die Forumsauslese-Redaktion: Wäre das nicht etwas, das in die FA aufgenommen werden könnte?
In welcher Form hättet Ihr den kleinen Beitrag denn gerne?