2009-08-25 19 views
69

Ich habe Bewertungen anzuzeigen und für die i-Schritte müssen Sie wie folgt vor:Wie richte ich auf die nächste 0,5?

Wenn die Nummer 1.0 ist es sollte Wenn auf 1
gleich sein sollte die Zahl 1,1 bis 1
gleich sein, wenn die Zahl 1,2 ist Wenn die Zahl ist, soll 1,4 bis 1,5
gleich sein, wenn sich die Anzahl sollte 1,5 bis 1,5
gleich sein, wenn sollte die Zahl 1,6 sein sollte auf 1
gleich sein, wenn die Zahl 1,3 auf 1,5
gleich sein sollten gleich 1.5
Wenn die Zahl 1,7 sollte gleichsein Wenn die Zahl 1,8 sollte auf 2,0
gleich sein, wenn die Zahl 1,9 sollte auf 2,0
gleich sein, wenn die Zahl 2,0 sollte auf 2,0
gleich sein, wenn die Zahl 2,1 sollte auf 2,0
gleich und so weiter ...

Gibt es eine einfache Möglichkeit, die erforderlichen Werte zu berechnen?

Antwort

150

Multiplizieren Sie Ihre Bewertung mit 2, dann Math.Round(rating, MidpointRounding.AwayFromZero) Runde verwendet, dann diesen Wert durch 2 teilen

+0

+1 Dieser Vorschlag ist richtig. –

+0

Funktioniert perfekt !!! Danke :) –

+5

bah, wenn ich nur schneller tippte, lol –

49

mit 2 multiplizieren, rund, teilt dann durch 2

, wenn Sie am nächsten Quartal wollen, multiplizieren mit 4, dividieren durch 4 usw.

+4

Einfach und perfekt. Genau das habe ich gesucht. Vielen Dank! – Michael

1
decimal d = // your number.. 

decimal t = d - Math.Floor(d); 
if(t >= 0.3d && t <= 0.7d) 
{ 
    return Math.Floor(d) + 0.5d; 
} 
else if(t>0.7d) 
    return Math.Ceil(d); 
return Math.Floor(d); 
0

Es gibt mehrere Optionen. Wenn Leistung ein Problem ist, testen Sie sie, um zu sehen, welche in einer großen Schleife am schnellsten funktioniert.

double Adjust(double input) 
{ 
    double whole = Math.Truncate(input); 
    double remainder = input - whole; 
    if (remainder < 0.3) 
    { 
     remainder = 0; 
    } 
    else if (remainder < 0.8) 
    { 
     remainder = 0.5; 
    } 
    else 
    { 
     remainder = 1; 
    } 
    return whole + remainder; 
} 
+0

Dies sollte funktionieren, aber es ist einfach nicht so elegant wie einige Lösungen gegeben. Multiplizieren und Verwenden der Systembibliothek ist einfach sexy. – captncraig

+0

Die Leistung ist in der Regel wichtiger, und das könnte weniger Zeit in Anspruch nehmen als die Multiplikations- und Divisionslösungen. –

+2

Dieser Code ist nicht korrekt. Da Arithmetik mit Doppelpunkten normalerweise kleine Rundungsfehler aufweist, könnte eine Operation wie 4,8 - 4,0 beispielsweise 0,799999 ... ergeben. In diesem Fall würde der obige Code auf 4.5 runden. Besser wäre es auch Math.Floor anstelle von Math.Truncate zu verwenden, denn gerade jetzt werden negative Zahlen nicht richtig gerundet. Ich bevorzuge die akzeptierte Antwort, weil sie einfacher und weniger anfällig für Implementierungsfehler ist. – Accipitridae

1

Klingt wie Sie müssen auf die nächste 0,5 runden. Ich sehe keine Version von round in der C# API, die dies tut (eine Version braucht eine Anzahl von Dezimalstellen zu runden, was nicht das Gleiche ist).

Angenommen, Sie müssen nur mit ganzzahligen Zehntel rechnen, es reicht aus, round (num * 2)/2 zu berechnen. Wenn Sie beliebig genaue Dezimalstellen verwenden, wird es schwieriger. Lass uns hoffen, dass du es nicht tust.

-1

Ich hatte auch Schwierigkeiten mit diesem Problem. I-Code vor allem in Actionscript 3.0, das ist die Basis-Codierung für die Adobe Flash-Plattform, aber es gibt simularities in den Sprachen:

Die Lösung kam ich mit ist die folgende:

//Code for Rounding to the nearest 0.05 
var r:Number = Math.random() * 10; // NUMBER - Input Your Number here 
var n:int = r * 10; // INTEGER - Shift Decimal 2 places to right 
var f:int = Math.round(r * 10 - n) * 5;// INTEGER - Test 1 or 0 then convert to 5 
var d:Number = (n + (f/10))/10; // NUMBER - Re-assemble the number 

trace("ORG No: " + r); 
trace("NEW No: " + d); 

Das ist es ziemlich viel . Beachten Sie die Verwendung von "Zahlen" und "Ganzzahlen" und die Art ihrer Verarbeitung.

Viel Glück!

9

Hier sind ein paar Methoden, die ich geschrieben habe, die immer auf irgendeinen Wert auf- oder abgerundet werden.

public static Double RoundUpToNearest(Double passednumber, Double roundto) 
{ 
    // 105.5 up to nearest 1 = 106 
    // 105.5 up to nearest 10 = 110 
    // 105.5 up to nearest 7 = 112 
    // 105.5 up to nearest 100 = 200 
    // 105.5 up to nearest 0.2 = 105.6 
    // 105.5 up to nearest 0.3 = 105.6 

    //if no rounto then just pass original number back 
    if (roundto == 0) 
    { 
     return passednumber; 
    } 
    else 
    { 
     return Math.Ceiling(passednumber/roundto) * roundto; 
    } 
} 

public static Double RoundDownToNearest(Double passednumber, Double roundto) 
{ 
    // 105.5 down to nearest 1 = 105 
    // 105.5 down to nearest 10 = 100 
    // 105.5 down to nearest 7 = 105 
    // 105.5 down to nearest 100 = 100 
    // 105.5 down to nearest 0.2 = 105.4 
    // 105.5 down to nearest 0.3 = 105.3 

    //if no rounto then just pass original number back 
    if (roundto == 0) 
    { 
     return passednumber; 
    } 
    else 
    { 
     return Math.Floor(passednumber/roundto) * roundto; 
    } 
} 
0

der richtige Weg, dies zu tun ist:

public static Decimal GetPrice(Decimal price) 
      { 
       var DecPrice = price/50; 
       var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero); 
       var finalPrice = roundedPrice * 50; 

       return finalPrice; 

      } 
0
Public Function Round(ByVal text As TextBox) As Integer 
    Dim r As String = Nothing 
    If text.TextLength > 3 Then 
     Dim Last3 As String = (text.Text.Substring(text.Text.Length - 3)) 
     If Last3.Substring(0, 1) = "." Then 
      Dim dimcalvalue As String = Last3.Substring(Last3.Length - 2) 
      If Val(dimcalvalue) >= 50 Then 
       text.Text = Val(text.Text) - Val(Last3) 
       text.Text = Val(text.Text) + 1 
      ElseIf Val(dimcalvalue) < 50 Then 
       text.Text = Val(text.Text) - Val(Last3) 
      End If 
     End If 
    End If 
    Return r 
End Function 
+4

Dieser Code sieht nicht wie C# in der Frage aus. Was tut es? Bitte geben Sie einige Erklärungen an, und nicht nur eine Menge Code in einer nicht näher definierten Sprache. – AdrianHHH