2012-04-09 19 views
1

ich nach einem Weg suchen mit den folgenden Bestimmungen auf den nächsten Dollar abzurunden:
(Wenn wholenumber.50 und oben aufrunden auf die nächste ganze Zahl)
(Wenn wholenumber.49 und unten abrunden auf die aktuelle ganze Zahl)Runde auf den nächsten Dollar

ich habe versucht:

Math.Round(wholenumber.xx, MidpointRounding.ToEven); 

Dies gilt nicht immer rund, wie ich zum Beispiel wollen 1,5 = 2 und 2,5 = 2, da es auf die nächste gerade Zahl aufgerundet wird.

habe ich auch versucht:

Math.Round(wholenumber.xx, MidpointRounding.AwayFromZero); 

Dies immer auf die höhere ganze Zahl aufgerundet.

Gibt es eingebaute Funktionen für das, was ich versuche zu tun, oder muss ich meine eigene benutzerdefinierte Methode schreiben, um die Anzahl zu überprüfen und den Boden oder die Decke abhängig zu machen?

+5

Gleitkomma-Arithmetik verwenden Währung zu speichern ist nie eine gute Idee, wenn .. – Jack

+0

Sie können Mathe tun .round ohne einen zweiten Parameter, denke ich? Das ist die Standardrundung, wie Sie es beschrieben haben. – MarioDS

+3

MidpointRounding.AwayRoundZero ist was du beschreibst. Es bedeutet nicht, alle Werte aufzurunden, nur Mittelpunkte (0,5). – dtb

Antwort

11

Zunächst einmal, ich merke, dass Sie immer decimal für diese Aufgabe verwenden sollten; Verwenden Sie niemals double. Wenn Sie double verwenden, stoppen Sie, was Sie gerade tun, und reparieren Sie Ihr Programm, so dass Sie einen Typ für Physik Probleme zu stoppen beginnen und einen Typ verwenden, der für Geld Probleme entwickelt, um Ihr Geld Problem zu lösen.

Zweitens sind Sie einfach falsch, wenn Sie

sagen Dies ist immer auf die höhere ganze Zahl aufgerundet.

Es tut es nicht. Es wird auf die nächste ganze Zahl gerundet, und wenn es keine nächste ganze Zahl gibt, weil Sie sich in einem Mittelpunkt befinden, wählt es die ganze Zahl, die weiter von entfernt ist.

Probieren Sie es aus, wenn Sie mir nicht glauben:

using System; 
class P 
{ 
    static void Main() 
    { 
    decimal buckFifty = 1.50m; 
    decimal buckFortyNine = 1.49m; 
    Console.WriteLine(Math.Round(buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(buckFifty, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFortyNine, MidpointRounding.AwayFromZero)); 
    Console.WriteLine(Math.Round(-buckFifty, MidpointRounding.AwayFromZero)); 
    } 
} 

Ergebnisse sind

1 
2 
-1 
-2 
+0

Ich sehe was du meinst. Ich habe darüber nachgedacht, im Mittelpunkt zu stehen. In der Mitte geht es immer zur höheren Zahl. Ich benutze Decimal auch schon. – Baxter

+1

@Baxter: * "Es geht immer zur höheren Zahl, wenn der Mittelpunkt erreicht ist." * - Laut Ihrer Frage, das ist genau das, was Sie wollen ... –

+0

Danke, das hat mich gereizt. –