Domanda

Qual è il modo migliore per restituire l'intero numero parte di un decimale (in c #)? (Questo deve funzionare per numeri molto grandi che potrebbero non rientrare in un int).

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

Lo scopo è: sto inserendo un campo decimale (30,4) nel db e voglio assicurarmi di non tentare di inserire un numero troppo lungo per il campo. Determinare la lunghezza dell'intero numero parte del decimale fa parte di questa operazione.

È stato utile?

Soluzione

A proposito ragazzi, (int) Decimal.MaxValue traboccerà. Non è possibile ottenere il & Quot; int & Quot; parte di un decimale perché il decimale è troppo grande per essere inserito nella casella int. Ho appena controllato ... è addirittura troppo grande per un lungo (Int64).

Se si desidera il bit di un valore decimale a SINISTRA del punto, è necessario eseguire questa operazione:

Math.Truncate(number)

e restituisce il valore come ... A DECIMAL o DOUBLE.

modifica: Troncare è sicuramente la funzione corretta!

Altri suggerimenti

Penso che System.Math.Truncate è ciò che sei cercando.

Dipende da cosa stai facendo.

Ad esempio:

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

o

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

L'impostazione predefinita è sempre la prima, che può essere una sorpresa ma ha molto senso .

Il tuo cast esplicito farà:

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

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

Dal modo in cui hai formulato la domanda sembra che questo non sia quello che vuoi - vuoi pavimentarlo ogni volta.

Vorrei fare:

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

Controlla anche le dimensioni dei tuoi decimal: possono essere piuttosto grandi, quindi potrebbe essere necessario utilizzare un long.

Devi solo lanciarlo, come tale:

int intPart = (int)343564564.4342

Se vuoi ancora usarlo come decimale nei calcoli successivi, allora Math.Truncate (o eventualmente Math.Floor se vuoi un determinato comportamento per numeri negativi) è la funzione che desideri.

Modo molto semplice per separare il valore e il suo valore parziale frazionario.

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

s è la parte frazionaria = 5 e
è valore come numero intero = 3

Spero di aiutarti.

/// <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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top