Frage

Was ist der beste Weg, um die ganze Zahl Teil einer Dezimalzahl (in c #) zurück? (Dies hat für sehr große Zahlen zu arbeiten, die nicht in einen int passen).

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

Der Zweck ist: ich in eine Dezimalzahl bin Einfügen (30,4) Feld in der db, und will sicherstellen, dass ich nicht versuchen, eine Nummer einfügen als für das Feld zu lang ist. Die Bestimmung der Länge des ganzzahligen Teils des Dezimalsystems Teil dieser Operation ist.

War es hilfreich?

Lösung

Durch die Art und Weise Männer, (int) Decimal.MaxValue überläuft. Sie können nicht den „int“ Teil einer Dezimalzahl bekommen, weil das Dezimalsystem zu friggen ist groß in dem int Feld zu setzen. So überprüft ... seine noch zu groß für eine lange (Int64).

Wenn Sie das Bit von einem Dezimalwert links von dem Punkt möchten, müssen Sie dies tun:

Math.Truncate(number)

und geben den Wert als ... Ein DECIMAL oder DOUBLE.

edit: Kürzen ist auf jeden Fall die richtige Funktion

Andere Tipps

Ich denke, System.Math.Truncate ist das, was du bist suchen.

Abhängig von, was Sie tun.

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

Der Standard ist immer die ehemalige, die eine Überraschung sein, aber macht sehr guten Sinn .

Ihre explizite Umwandlung tun:

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

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

Von der Art und Weise Sie die Frage formuliert habe es so klingt, ist nicht das, was Sie wollen -. Sie Stock es jedes Mal zu wollen

ich tun würde:

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

Auch die Größe Ihres decimal überprüfen - sie können sehr groß sein, so dass Sie einen long verwenden müssen, können

.

Sie müssen es einfach nur werfen, wie zum Beispiel:

int intPart = (int)343564564.4342

Wenn Sie es noch als Dezimalzahl in späteren Berechnungen verwendet werden sollen, dann Math.Truncate (oder möglicherweise Math.Floor, wenn Sie ein bestimmtes Verhalten für negative Zahlen wollen) ist die Funktion, die Sie wollen.

Sehr einfache Möglichkeit, einzelnen Wert und sein Bruchteil Wert.

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

s ist Bruchteil = 5 und
i ist Wert als integer = 3

Ich hoffe, Ihnen 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));
}
   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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top