2009-08-25 13 views
69

mam do wyświetlania ocen i za to muszę przyrosty następująco:Jak zaokrąglić do najbliższego 0,5?

Jeśli numer jest 1.0 powinna być równa 1
Jeśli numer jest 1.1 powinna być równa 1
Jeśli numer jest 1,2 powinna być równa 1
Jeśli liczba 1,3 powinien być równy 1,5
Jeśli liczba 1.4 powinien być równy 1,5
Jeśli liczba 1.5 powinien być równy 1,5
Jeśli liczba 1,6 powinny równa 1,5
Jeśli liczba wynosi 1,7, powinna być równa 1,5
Jeśli liczba 1.8 powinien być równy 2,0
Jeżeli liczba 1,9 powinien być równy 2,0
Jeżeli liczba 2,0 powinien być równy 2,0
Jeżeli liczba 2,1 powinien być równy 2,0
i tak dalej ...

Czy istnieje prosty sposób obliczenia wymaganych wartości?

Odpowiedz

150

pomnożyć ocena przez 2, a następnie za pomocą Math.Round(rating, MidpointRounding.AwayFromZero) okrągły, a następnie podzielić tę wartość przez 2.

+0

+1 Ta sugestia jest prawidłowa. –

+0

Działa idealnie !!! Dzięki :) –

+5

bah, jeśli tylko napisałem szybciej, lol –

49

pomnożyć przez 2, okrągła, a następnie podzielić przez 2

jeśli chcesz najbliższy kwartał, należy pomnożyć przez 4, podzielić przez 4, itd.

+4

Prosty i doskonały. Właśnie tego szukałem. Dzięki! – 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

Istnieje kilka opcji. Jeśli wydajność jest problemem, przetestuj je, aby zobaczyć, które działa najszybciej w dużej pętli.

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

To powinno zadziałać, ale nie jest tak eleganckie, jak niektóre podane rozwiązania. Mnożenie i używanie biblioteki systemowej jest po prostu sexy. – captncraig

+0

Wydajność jest zazwyczaj ważniejsza, a to może zająć mniej czasu niż rozwiązania mnożenia i dzielenia. –

+2

Ten kod jest niepoprawny. Ponieważ arytmetyczna z dublami ma zazwyczaj małe błędy zaokrąglania, operacja taka jak 4,8 - 4,0 może dać np. 0.799999 .... W tym przypadku powyższy kod zostanie zaokrąglony do 4,5. Również lepiej byłoby użyć Math.Floor zamiast Math.Truncate, ponieważ teraz liczby ujemne nie są poprawnie zaokrąglone. Preferuję zaakceptowaną odpowiedź, ponieważ jest ona prostsza i mniej podatna na błędy implementacyjne. – Accipitridae

1

Wygląda na to, że trzeba zaokrąglić do najbliższego 0,5. Nie widzę wersji round w API C#, która to robi (jedna wersja ma liczbę cyfr dziesiętnych do zaokrąglenia, co nie jest tym samym).

Zakładając, że masz do czynienia tylko z liczbami całkowitymi w dziesiątych częściach, wystarczy obliczyć round (num * 2)/2. Jeśli używasz arbitralnie dokładnych liczb dziesiętnych, staje się to trudniejsze. Miejmy nadzieję, że tego nie zrobisz.

-1

Miałem problemy z tym problemem. I Kod głównie w języku ActionScript 3.0, który jest kodowanie baza dla platformy Adobe Flash, ale w językach istnieją simularities:

Rozwiązanie wymyśliłem jest następujący:

//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); 

Thats dość dużo . Zwróć uwagę na użycie "Liczb" i "Liczb całkowitych" oraz sposobu ich przetwarzania.

Powodzenia!

9

Oto kilka metod, które napisałem, które zawsze będą zaokrąglane w górę lub w dół do dowolnej wartości.

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

poprawny sposób to zrobić:

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

Ten kod nie wygląda jak C# jak chciał w pytaniu. Co to robi? Proszę podać wyjaśnienie, a nie tylko bryłę kodu w nieokreślonym języku. – AdrianHHH

Powiązane problemy