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.
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!
Je pense que Système.Mathématique.Tronquer est ce que vous cherchez.
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
.
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.
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
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