¿Cómo redondeo al 0.5 más cercano?

Tengo que mostrar calificaciones y para eso necesito incrementos de la siguiente manera:

Si el número es 1.0, debería ser igual a 1
Si el número es 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 debería ser igual a 1.5
Si el número es 1,4 debe ser igual a 1.5
Si el número es 1.5 debe ser igual a 1.5
Si el número es 1.6 debería ser 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 debería ser igual a 2.0
Si el número es 1.9 debería ser igual a 2.0
Si el número es 2.0 debería ser igual a 2.0
Si el número es 2.1 debería ser igual a 2.0
y así…

¿Hay una manera simple de calcular los valores requeridos?

Multiplique su calificación por 2, luego redondee usando Math.Round(rating, MidpointRounding.AwayFromZero) , luego divida ese valor por 2.

Multiplique por 2, redondee, luego divida por 2

si quiere el cuarto más cercano, multiplique por 4, divida por 4, etc.

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

Parece que necesitas redondear al 0.5 más cercano. No veo ninguna versión de la round en la API C # que hace esto (una versión toma un número 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 el round (num * 2) / 2 . Si usa decimales arbitrariamente precisos, se vuelve más complicado. Esperemos que no.

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; } 

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; } 
 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 

También tuve dificultades con este problema. Cifro principalmente en Actionscript 3.0, que es la encoding básica de la plataforma Adobe Flash, pero hay similitudes en los idiomas:

La solución que surgió 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 practicamente todo. Tenga en cuenta el uso de ‘Números’ y ‘Enteros’ y la forma en que se procesan.

¡Buena suerte!