web-dev-qa-db-fra.com

Comment puis-je arrondir à 0,5 près?

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?

90
Murtaza Mandvi

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

188
John Rasch

Multiplier par 2, arrondir, puis diviser par 2

si vous voulez le quart le plus proche, multipliez par 4, divisez par 4, etc.

61
Neil N

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;
    }
}
14
NER1808
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);
1
Akash Kava

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;
}
1
John Fisher

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.

1
Paul Brinkley
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
0
user2260011