Come faccio a arrotondare allo 0,5?

Devo visualizzare le valutazioni e per questo ho bisogno di incrementi come segue:

Se il numero è 1.0, dovrebbe essere uguale a 1
Se il numero è 1.1 dovrebbe essere uguale a 1
Se il numero è 1.2 dovrebbe essere uguale a 1
Se il numero è 1.3 dovrebbe essere uguale a 1.5
Se il numero è 1.4 dovrebbe essere uguale a 1.5
Se il numero è 1.5 dovrebbe essere uguale a 1.5
Se il numero è 1,6 dovrebbe essere uguale a 1,5
Se il numero è 1.7 dovrebbe essere uguale a 1.5
Se il numero è 1.8 dovrebbe essere uguale a 2.0
Se il numero è 1.9 dovrebbe essere uguale a 2.0
Se il numero è 2.0 dovrebbe essere uguale a 2.0
Se il numero è 2.1 dovrebbe essere uguale a 2.0
e così via…

C’è un modo semplice per calcolare i valori richiesti?

Moltiplica la tua valutazione per 2, quindi arrotondala usando Math.Round(rating, MidpointRounding.AwayFromZero) , quindi dividi quel valore per 2.

Moltiplicare per 2, arrotondare, quindi dividere per 2

se vuoi il quarto più vicino, moltiplica per 4, dividi per 4, ecc

Qui ci sono un paio di metodi che ho scritto che andranno sempre su o giù per qualsiasi valore.

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

Sembra che tu debba arrotondare allo 0,5 più vicino. Non vedo alcuna versione di round nell’API C # che esegue questa operazione (una versione prende un numero di cifre decimali a cui arrotondare, che non è la stessa cosa).

Supponendo che tu abbia a che fare con numeri interi di decimi, è sufficiente calcolare il round (num * 2) / 2 . Se usi decimali arbitrariamente precisi, diventa più complicato. Speriamo che tu non lo faccia.

Ci sono diverse opzioni Se le prestazioni sono un problema, provali per vedere quale funziona più velocemente in un loop di grandi dimensioni.

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

Il modo corretto per farlo è:

  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 

Ho avuto anche difficoltà con questo problema. Io codice principalmente in Actionscript 3.0, che è la codifica di base per la piattaforma Adobe Flash, ma ci sono delle similitudini nelle lingue:

La soluzione che ho trovato è la seguente:

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

Questo è praticamente tutto. Notare l’uso di “Numeri” e “Numeri interi” e il modo in cui vengono elaborati.

In bocca al lupo!