Question

Quel est le meilleur moyen de renvoyer le nombre entier d’une décimale (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.

Était-ce utile?

La solution

Au fait, les gars, (int) Decimal.MaxValue débordera. Vous ne pouvez pas obtenir le & Quot; int & Quot; une partie d’une décimale car la décimale est trop grosse pour être placée dans la case int. Je viens de vérifier ... c'est même trop grand pour un long (Int64).

Si vous souhaitez que le bit d'une valeur décimale soit placé à GAUCHE du point, procédez comme suit:

Math.Truncate(number)

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

edit: Truncate est certainement la fonction correcte!

Autres conseils

Je pense que System.Math.Truncate est ce que vous êtes à la recherche de.

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 l'ancienne, ce qui peut être une surprise, mais a tout son sens .

Votre distribution explicite fera:

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

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

De la manière dont vous avez formulé la question, vous avez l’impression que ce n’est 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 - ils peuvent être assez gros, vous devrez peut-être utiliser un long.

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, Math.Truncate (ou éventuellement Math.Floor si vous souhaitez un certain comportement pour les nombres négatifs) est la fonction que vous souhaitez.

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 fractional part = 5 et
i est la valeur sous la forme d'un entier = 3

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));
}
   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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top