web-dev-qa-db-fra.com

Meilleure façon d'obtenir le nombre entier dans un nombre décimal

Quel est le meilleur moyen de renvoyer la partie entière d’un nombre décimal (en c #)? (Cela doit fonctionner pour un très grand nombre qui ne rentre pas dans un int). 

GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324

Le but de ceci est: J'insère dans un champ décimal (30,4) de la base de données et je veux m'assurer que je n'essaie pas d'insérer un nombre trop long pour le champ. La détermination de la longueur du nombre entier de la décimale fait partie de cette opération.

74
Yaakov Ellis

Au fait, les gars, (int) Decimal.MaxValue débordera. Vous ne pouvez pas obtenir la partie "int" d'une décimale car la décimale est trop grosse pour être placée dans la zone int. Je viens de vérifier ... c'est même trop gros pour longtemps (Int64). 

Si vous voulez le bit d'une valeur décimale à la gauche du point, vous devez procéder comme suit:

Math.Truncate(number)

et renvoyer la valeur en tant que ... A DECIMAL ou DOUBLE.

edit: Truncate est certainement la fonction correcte!

181
Will

Je pense que System.Math.Truncate est ce que vous cherchez.

22
Mark Carpenter

Cela dépend de ce que vous faites.

Par exemple:

//bankers' rounding - midpoint goes to nearest even
GetIntPart(2.5) >> 2
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -6

ou 

//arithmetic rounding - midpoint goes away from zero
GetIntPart(2.5) >> 3
GetIntPart(5.5) >> 6
GetIntPart(-6.5) >> -7

La valeur par défaut est toujours la première, ce qui peut être une surprise, mais est très logique .

Votre distribution explicite fera:

int intPart = (int)343564564.5
// intPart will be 343564564

int intPart = (int)343564565.5
// intPart will be 343564566

D'après la façon dont vous avez formulé la question, il semble que ce ne soit pas ce que vous voulez, vous voulez la poser à chaque fois.

Je ferais:

Math.Floor(Math.Abs(number));

Vérifiez également la taille de votre decimal - elles peuvent être assez grandes. Vous devrez donc peut-être utiliser un long.

3
Keith

J'espère vous aider.

/// <summary>
/// Get the integer part of any decimal number passed trough a string 
/// </summary>
/// <param name="decimalNumber">String passed</param>
/// <returns>teh integer part , 0 in case of error</returns>
private int GetIntPart(String decimalNumber)
{
    if(!Decimal.TryParse(decimalNumber, NumberStyles.Any , new CultureInfo("en-US"), out decimal dn))
    {
        MessageBox.Show("String " + decimalNumber + " is not in corret format", "GetIntPart", MessageBoxButtons.OK, MessageBoxIcon.Error);
        return default(int);
    } 

    return Convert.ToInt32(Decimal.Truncate(dn));
}
0
luka

Un moyen très facile de séparer la valeur et sa valeur de fraction.

double  d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");

s est une partie fractionnaire = 5 et
i est la valeur sous la forme d'un entier = 3

0
Amit Gohel

Vous avez juste besoin de le lancer, comme tel:

int intPart = (int)343564564.4342

Si vous souhaitez toujours l'utiliser comme décimal dans les calculs ultérieurs, alors Math.Truncate (ou éventuellement Math.Floor si vous souhaitez un certain comportement pour les nombres négatifs) est la fonction que vous souhaitez.

0
Noldorin