Quelle est la meilleure façon de renvoyer la partie entière d'un nombre décimal (en c #)? (Cela doit fonctionner pour de très grands nombres qui peuvent ne pas rentrer 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'essaye 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.
Réponses:
Au fait les gars, (int) Decimal.MaxValue débordera. Vous ne pouvez pas obtenir la partie "int" d'une décimale parce que la décimale est trop grande pour être placée dans la zone int. Je viens de vérifier ... c'est encore trop gros pendant longtemps (Int64).
Si vous voulez le bit d'une valeur décimale à GAUCHE du point, vous devez faire ceci:
et renvoyez la valeur comme ... UN DECIMAL ou un DOUBLE.
edit: Tronquer est définitivement la bonne fonction!
la source
Je pense que System.Math.Truncate est ce que vous recherchez.
la source
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 qui 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 n'est pas ce que vous voulez - vous voulez la poser à chaque fois.
Je ferais:
Vérifiez également la taille de votre
decimal
- ils peuvent être assez gros, vous devrez peut-être utiliser un fichierlong
.la source
Il vous suffit de le lancer, en tant que 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 voulez un certain comportement pour les nombres négatifs) est la fonction souhaitée.
la source
Moyen très simple 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 une valeur comme entier = 3
la source
(int)Decimal.MaxValue
cela débordera.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)); }
la source
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
la source
decimal
est bien plus grande que celle deint
. De plus, ce n'est pas une question VB.