Feedback

Runden vor dem Komma

Sprache: C#

Analog zu Math.Round übergibt man bei dieser Methode eine numerische Zahl mit der Anzahl der Stellen, die VOR dem Komma gerundet werden sollen. Um z.B. den nächsten Zehnerwert von 316 zu finden, übergibt man 1, für Hunderter 2 usw. [code] overround(316) // 316 overround(316, 1) // 320 overround(316, 2) // 300 overround(316, 3) // 0 overround(501, 0) // 501 overround(501, 1) // 500 overround(501, 2) // 500 overround(501, 3) // 1000 [/code]
public static int overround(object input, int length = 0)
{
    if (input is int | input is double | input is decimal | input is float)
    {
        double value = Convert.ToDouble(input);
        int div = (int)Math.Pow(10, length);
        return ((int)Math.Round(value / div, 0) * div);
    }
    throw new ArgumentException("Input is not numeric");
}
public static int overround(object input, int length = 0)
{
    if (input is int | input is double | input is decimal | input is float)
    {
        double value = Convert.ToDouble(input);
        int div = (int)Math.Pow(10, length);
        return ((int)Math.Round(value / div, 0) * div);
    }
    throw new ArgumentException("Input is not numeric");
}

1 Kommentar

  1. Und was ist mit Byte, Short und Long sowie deren jeweiligen U/S-Versionen?

    Ich würde verschiedene Überladungen für jeden Typ schreiben, da eben nicht alles gleich funktioniert. Beispielsweise könnte man mit einem Großen Dezimal arbeiten und deine Methode würde fehlerhaft runden, da Double weniger genau ist. Das ist das ewige Problem der vielen Zahlen-Typen.

    Wenigstens solltest du jedoch verlangen das input IConvertible implementiert. Am besten über die Einschränkung eines generischen Typs.