it-swarm.com.de

Der beste Weg, um einen ganzzahligen Teil einer Dezimalzahl zu erhalten

Was ist der beste Weg, um den ganzzahligen Teil einer Dezimalzahl (in c #) zurückzugeben? (Dies muss für sehr große Zahlen funktionieren, die möglicherweise nicht in ein int passen). 

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

Der Zweck davon ist: Ich füge ein Dezimalfeld (30,4) in der Datenbank ein und möchte sicherstellen, dass ich nicht versuche, eine Zahl einzufügen, die für das Feld zu lang ist. Das Bestimmen der Länge des ganzzahligen Teils der Dezimalzahl ist Teil dieser Operation.

74
Yaakov Ellis

Übrigens, Jungs (int) Decimal.MaxValue wird überlaufen. Sie können den "int" -Teil einer Dezimalzahl nicht erhalten, da die Dezimalzahl zu groß ist, um sie in die Int-Box zu setzen. Nur überprüft ... es ist für eine lange Zeit sogar zu groß (Int64). 

Wenn Sie möchten, dass das Bit eines Dezimalwerts LEFT des Punkts ist, müssen Sie Folgendes tun:

Math.Truncate(number)

und geben Sie den Wert als ... A DECIMAL oder DOUBLE zurück.

edit: Abschneiden ist definitiv die richtige Funktion!

181
Will

Ich denke, System.Math.Truncate ist was Sie suchen.

22
Mark Carpenter

Kommt drauf an was du tust.

Zum Beispiel:

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

oder 

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

Die Standardeinstellung ist immer die erste, was eine Überraschung sein kann, aber macht einen sehr guten Sinn .

Ihre explizite Besetzung wird Folgendes tun:

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

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

Von der Art, wie Sie die Frage formuliert haben, klingt es so, als wäre dies nicht das, was Sie wollen - Sie wollen es jedes Mal unterdrücken.

Ich würde tun:

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

Überprüfen Sie auch die Größe Ihrer decimal - sie können ziemlich groß sein, so dass Sie möglicherweise eine long verwenden müssen.

3
Keith

Ich hoffe dir zu helfen.

/// <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));
}
0
luka

Sehr einfache Möglichkeit, den Wert und den Bruchteilwert voneinander zu trennen.

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

s ist Bruchteil = 5 und
i ist ein Wert als ganze Zahl = 3

0
Amit Gohel

Sie müssen es einfach als solches werfen:

int intPart = (int)343564564.4342

Wenn Sie es in späteren Berechnungen noch als Dezimalzahl verwenden möchten, ist Math.Truncate (oder möglicherweise Math.Floor, wenn Sie ein bestimmtes Verhalten für negative Zahlen haben möchten) die gewünschte Funktion.

0
Noldorin