2009-08-25 36 views
69

I tienen para mostrar calificaciones y para que necesito incrementos como sigue:¿Cómo redondeo al 0.5 más cercano?

Si el número es 1.0 debe ser igual a 1
Si el número es de 1,1 debe ser igual a 1
Si el número es 1,2 debe ser igual a 1
Si el número es 1.3 debe ser igual a 1,5
Si el número es de 1,4 debe ser igual a 1,5
Si el número es de 1,5 debe ser igual a 1,5
Si el número es 1,6 debería haber igual a 1.5
Si el número es 1.7 debería ser igual a 1.5
Si el número es 1.8 debe ser igual a 2,0
Si el número es de 1,9 debe ser igual a 2,0
Si el número es de 2,0 debe ser igual a 2,0
Si el número es de 2,1 debe ser igual a 2,0
y así sucesivamente ...

¿Existe una manera simple de calcular los valores requeridos?

Respuesta

150

Multiplicar su calificación por 2, luego se redondea utilizando Math.Round(rating, MidpointRounding.AwayFromZero), y luego dividir ese valor por 2.

+0

+1 Esta sugerencia es correcta. –

+0

¡Funciona perfectamente! Gracias :) –

+5

bah, si solo tecleo más rápido, lol –

49

Multiplicar por 2, redondo, y se divide por 2

si quieres cuarto más cercano, se multiplica por 4, dividir por 4, etc.

+4

Simple y perfecto. Esto es exactamente lo que estaba buscando. ¡Gracias! – 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

Hay varias opciones. Si el rendimiento es una preocupación, pruébelos para ver cuál funciona más rápido en un bucle grande.

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

Esto debería funcionar, pero simplemente no es tan elegante como algunas soluciones dadas. Multiplicar y usar la biblioteca del sistema es simplemente sexy. – captncraig

+0

El rendimiento suele ser más importante, y esto podría llevar menos tiempo que las soluciones de multiplicación y división. –

+2

Este código no es correcto. Dado que la aritmética con dobles generalmente tiene algunos pequeños errores de redondeo, una operación como 4.8 - 4.0 podría dar, por ejemplo, 0.799999 .... En este caso, el código anterior redondeará a 4.5. También sería mejor utilizar Math.Floor en lugar de Math.Truncate, porque en este momento los números negativos no se corrigen correctamente. Prefiero la respuesta aceptada, porque es más simple y menos propensa a errores de implementación. – Accipitridae

1

Parece que necesita redondear al 0.5 más cercano. No veo ninguna versión de round en la API de C# que hace esto (una versión toma una cantidad de dígitos decimales para redondear a, que no es lo mismo).

Suponiendo que solo tiene que ocuparse de números enteros de décimas, es suficiente calcular round (num * 2)/2. Si usa decimales arbitrariamente precisos, se vuelve más complicado. Esperemos que no.

-1

Tuve dificultades con este problema también. código que sobre todo en ActionScript 3.0, que es la codificación de base para la Plataforma Adobe Flash, pero hay simularities en los idiomas:

La solución que se me ocurrió es la siguiente:

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

Eso es más o menos lo . Tenga en cuenta el uso de 'Números' y 'Enteros' y la forma en que se procesan.

¡Buena suerte!

9

Aquí hay un par de métodos que escribí que siempre redondean hacia arriba o hacia abajo a cualquier valor.

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

La forma correcta de hacerlo es:

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

Este código no se ve como C# como se quería en la pregunta. ¿Qué hace? Proporcione alguna explicación en lugar de solo un trozo de código en un idioma no especificado. – AdrianHHH

Cuestiones relacionadas