web-dev-qa-db-fra.com

Arrondir les entiers au plus proche multiple de 10

J'essaie de comprendre comment arrondir les prix - dans les deux sens. Par exemple:

Round down
43 becomes 40
143 becomes 140
1433 becomes 1430

Round up
43 becomes 50
143 becomes 150
1433 becomes 1440

J'ai la situation où j'ai une fourchette de prix de dire: 

£143 - £193

dont je veux montrer que: 

£140 - £200

comme il a l'air beaucoup plus propre

Des idées sur la façon dont je peux y arriver?

27
dhardy

Je voudrais juste créer un couple de méthodes;

int RoundUp(int toRound)
{
     if (toRound % 10 == 0) return toRound;
     return (10 - toRound % 10) + toRound;
}

int RoundDown(int toRound)
{
    return toRound - toRound % 10;
}

Modulus nous donne le reste. En cas d'arrondi, 10 - r vous amène au dixième le plus proche, pour arrondir à la soustraction, il suffit de soustraire r. Assez simple.

57
evanmcdonnal

Vous n'avez pas besoin d'utiliser le module (%) ou la virgule flottante ...

Cela marche:

public static int RoundUp(int value)
{
    return 10*((value + 9)/10);
}

public static int RoundDown(int value)
{
    return 10*(value/10);
}
14
Matthew Watson

Ce code arrondit au multiple de 10 le plus proche:

int RoundNum(int num)
{
     int rem = num % 10;
     return rem >= 5 ? (num - rem + 10) : (num - rem);
}

Utilisation très simple: 

Console.WriteLine(RoundNum(143)); // prints 140
Console.WriteLine(RoundNum(193)); // prints 190
10
PaRiMaL RaJ

Une méthode générale pour arrondir un nombre à un multiple d'un autre, en arrondissant loin de zéro .

Pour entier

int RoundNum(int num, int step)
{
    if (num >= 0)
        return ((num + (step / 2)) / step) * step;
    else
        return ((num - (step / 2)) / step) * step;
}

Pour float

float RoundNum(float num, float step)
{
    if (num >= 0)
        return floor((num + step / 2) / step) * step;
    else
        return ceil((num - step / 2) / step) * step;
}

Je sais que certaines parties peuvent sembler contre-intuitives ou pas très optimisées. J'ai essayé de transtyper (num + step/2) sur un int, mais cela donnait des résultats erronés pour les flottants négatifs ((int) -12.0000 = -11 et autres). Quoi qu'il en soit, voici quelques cas que j'ai testés:

  • tout nombre arrondi à l'étape 1 doit être lui-même
  • -3 arrondi à l'étape 2 = -4
  • -2 arrondi à l'étape 2 = -2
  • 3 arrondi à l'étape 2 = 4
  • 2 arrondi à l'étape 2 = 2
  • -2,3 arrondi au pas 0.2 = -2,4
  • -2,4 arrondi au pas 0.2 = -2,4
  • 2,3 arrondi à l'étape 0,2 = 2,4
  • 2,4 arrondi au pas 0,2 = 2,4
4
Chris Maes

Divisez le nombre par 10.

number = number / 10;
Math.Ceiling(number);//round up
Math.Round(number);//round down

Puis multipliez par 10.

number = number * 10;
4
Sharun
public static int Round(int n)
        {
            // Smaller multiple 
            int a = (n / 10) * 10;

            // Larger multiple 
            int b = a + 10;

            // Return of closest of two 
            return (n - a > b - n) ? b : a;
        }
0
Liakat