Je dois afficher les notes et pour cela j'ai besoin d'incréments comme suit:
Si le nombre est 1.0, il devrait être égal à 1
Si le nombre est 1.1 devrait être égal à 1
Si le nombre est 1.2 devrait être égal à 1
Si le nombre est 1.3 devrait être égal à 1,5
Si le nombre est 1.4 devrait être égal à 1,5
Si le nombre est de 1,5, il devrait être égal à 1,5.
Si le nombre est égal à 1,6, il devrait être égal à 1,5.
Si le nombre 1.7 est égal à 1.5
Si le nombre est 1.8 devrait être égal à 2,0
Si le nombre est 1.9 devrait être égal à 2,0
Si le nombre est 2.0 devrait être égal à 2.0
Si le nombre 2.1 est égal à 2.0
etc...
Existe-t-il un moyen simple de calculer les valeurs requises?
Multipliez votre note par 2, arrondissez ensuite à l'aide de Math.Round(rating, MidpointRounding.AwayFromZero)
, puis divisez cette valeur par 2.
Math.Round(value * 2, MidpointRounding.AwayFromZero) / 2
Multiplier par 2, arrondir, puis diviser par 2
si vous voulez le quart le plus proche, multipliez par 4, divisez par 4, etc.
Voici quelques méthodes que j'ai écrites et qui arrondiront toujours à n'importe quelle valeur.
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);
Il y a plusieurs options. Si les performances sont un problème, testez-les pour voir lequel fonctionne le plus rapidement dans une grande boucle.
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;
}
On dirait que vous devez arrondir à 0,5 près. Je ne vois aucune version de round
dans l'API C # qui effectue cela (une version prend un nombre de chiffres décimaux à arrondir, ce qui n'est pas la même chose).
En supposant que vous n'ayez à traiter que des nombres entiers de dixièmes, il suffit de calculer round (num * 2) / 2
. Si vous utilisez des décimales arbitrairement précises, cela devient plus compliqué. Espérons que ce n'est pas le cas.
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