Meilleure façon d'obtenir un nombre entier d'une partie d'un nombre Décimal

Quelle est la meilleure façon de retourner la partie entière d'un nombre décimal (en c#)? (Cela doit fonctionner pour de très grands nombres qui peuvent ne pas entrer 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) dans 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 de la partie entière du nombre décimal fait partie de cette opération.

68
demandé sur Wai Ha Lee 2009-01-26 15:59:52

6 réponses

Par la façon dont les gars, (int)décimal.MaxValue débordera. Vous ne pouvez pas obtenir la partie " int " d'une décimale car la décimale est trop grande pour être placée dans la boîte int. Viens de vérifier... c'est même trop grand pour une longue (Int64).

Si vous voulez le bit D'une valeur décimale à gauche du point, vous devez faire ceci:

Math.Truncate(number)

Et renvoie la valeur comme... Une décimale ou un DOUBLE.

edit: Truncate est définitivement la bonne fonction!

168
répondu Will 2011-07-21 12:26:00

Je pense que Système.Mathématique.Tronquer est ce que vous cherchez.

22
répondu Mark Carpenter 2009-01-26 13:32:05

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 fait très bon sens .

Votre distribution explicite fera l'affaire:

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

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

De la façon dont vous avez formulé la question, il semble que ce n'est pas ce que vous voulez - vous voulez le plancher à chaque fois.

Je ferais:

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

Vérifiez également la taille de votre decimal - ils peuvent être assez gros, donc vous devrez peut-être utiliser un long.

3
répondu Keith 2009-01-26 13:26:10

Vous avez juste besoin de le lancer, en tant que tel:

int intPart = (int)343564564.4342

Si vous voulez toujours l'utiliser comme décimal dans les calculs ultérieurs, alors Math.Tronquer (ou éventuellement mathématiques.Étage si vous voulez un certain comportement pour les nombres négatifs) est la fonction que vous voulez.

0
répondu Noldorin 2009-01-26 13:03:21

Moyen très facile de séparer la valeur et sa valeur de partie fractionnaire.

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 en entier = 3

0
répondu Amit Gohel 2015-10-17 12:46:49
   Public Function getWholeNumber(number As Decimal) As Integer
    Dim round = Math.Round(number, 0)
    If round > number Then
        Return round - 1
    Else
        Return round
    End If
End Function
-2
répondu Mattheu Norwood 2017-05-09 14:49:48