2017-04-30 2 views
0

ich zur Zeit versuche, eine genaue Zahl aus einer Formel zu berechnen, aber Probleme habe Umwandlung dezimal Komponenten einer ganzen Zahl,Dezimalzahlen zum nächsten 5. Rundung C#

Zum Beispiel, wenn ich 10 durch 3 teilen I‘ Ich habe 3.3333, Meine Berechnung müsste von 3.2 sein. Wenn ich 6.5 hätte, müsste Meine Berechnung 6.4 sein.

Wo ich kämpfe ist fangen die Dezimalstelle dieser beweglichen Nummer, dann rundet nur den Dezimalteil dieser Zahl. Einige Beispiele für meinen Code unter

// This number should be rounded down to the nearest .2 
TopCalc = (In - UpperThreshold) * (TopPerc/100); 

// This number should be rounded down to the nearest .2 
MidCalc = (UpperThreshold - LowerThreshold) * (MidPerc/100); 

// This number should be rounded down to the nearest .2 
LowCalc = LowerThreshold * (LowPerc/100); 

decimal Total = TopCalc + MidCalc + LowCalc; 

return Total; 

So ist es weiter nach unten zu brechen, kann sagen, jeder 0,2 ist eine 20cents/Pence-Münze, 90% einer Münze ist kein gesetzliches Zahlungsmittel, so in einer Situation, von Ihnen mit geben, $/£ 120,36 und alles, was Sie für den Wechsel haben, sind 20 Cent/Pence Stücke, Sie würden nur $/£ 120,20 geben, da die 16 Cent/Pence in diesem Beispiel keine ganze Münze ausmachen. Weitere Beispiele sind unter

1.235 = 1.2 
1.599 = 1.4 
1.611 = 1.6 
1.799999999999 = 1.6 
1.85 = 1.8 

immer zum nächstgelegenen wörtlichen 0,2 niemals Aufrundung Abrundung.

+2

was meinst du mit "die nächste' .2' "? In Ihrem ersten Beispiel ('3.3333 == 3.2') klingt es so, als ob Sie das Literal' .2' meinen, aber in Ihrem zweiten Beispiel ('6.5 == 6.4') scheint es, als ob Sie die nächste gerade Zahl meinen. Aber das würde Ihr erstes Beispiel nicht korrekt machen, da die nächste gerade Zahl '.4' ist. –

+0

Ich sehe, was Sie sagen, würde ich sagen, abgerundet auf den nächsten Literal .2. Also im Grunde ist 1.9 0, 3,9 ist 2, kein Aufrunden – Crackhouse2

+0

Sorry, aber das ist noch verwirrender. Jetzt ignorieren Ihre Beispiele die Dezimalzahl und runden auf die nächste, ganze, gerade Zahl ab. Bitte aktualisieren Sie Ihre Frage mit genau was Sie wollen, und einige extreme Beispiele, die es klären. –

Antwort

1

Sind Ihre Nachkommastellen immer positiv oder können sie negativ sein?

Ich habe es geschafft zu arbeiten, aber es ist nicht sehr elegant. Es kann eine bessere Lösung:

decimal d = 2.235M; 
    int i; 

    d = Math.Round(d, 1); 
    i = (int) (d*10); 
    i = i >> 1; 
    i = i << 1; 
    d = (decimal) i/10; 
+0

Die Dezimalstellen werden sei immer positiv, ich installiere gerade ein SDK, aber werde die Ergebnisse zurücksenden, es ist ein kniffliges, um es gelinde auszudrücken – Crackhouse2

2

Sie so etwas wie

static decimal NthRound(decimal d, decimal nth) 
{ 
    var intPart = decimal.Truncate(d); 
    var fifth = decimal.Truncate(nth * (d - intPart))/nth; 
    return intPart + fifth ;   
} 

und dann

Console.WriteLine(NthRound(10M/2M, 5M)); 
Console.WriteLine(NthRound(10M/3M, 5M)); 
Console.WriteLine(NthRound(13M/2M, 5M)); 

die

enter image description here

bekommt verwenden können welches in diesem Fall auf die nächste 5 abrundet.