Jaki jest najlepszy sposób na zwrócenie części całkowitej liczby ułamka dziesiętnego (w języku C #)? (To musi zadziałać dla bardzo dużych liczb, które mogą nie pasować do int).
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
Celem tego jest: wstawiam do pola dziesiętnego (30,4) w bazie danych i chcę się upewnić, że nie próbuję wstawiać liczby, która jest zbyt długa dla tego pola. Częścią tej operacji jest określenie długości całkowitej części dziesiętnej.
Odpowiedzi:
Swoją drogą faceci, (int) Decimal.MaxValue się przepełni. Nie możesz uzyskać części „int” ułamka dziesiętnego, ponieważ jest on zbyt duży, aby można go było umieścić w polu int. Właśnie sprawdzone ... jest nawet za duży na długi (Int64).
Jeśli chcesz, aby bit wartości Decimal znajdował się po LEWEJ STRONIE kropki, musisz to zrobić:
i zwróć wartość jako ... A DECIMAL lub DOUBLE.
edit: Truncate to zdecydowanie właściwa funkcja!
źródło
Myślę, że System.Math.Truncate jest tym, czego szukasz.
źródło
Zależy od tego, co robisz.
Na przykład:
//bankers' rounding - midpoint goes to nearest even GetIntPart(2.5) >> 2 GetIntPart(5.5) >> 6 GetIntPart(-6.5) >> -6
lub
//arithmetic rounding - midpoint goes away from zero GetIntPart(2.5) >> 3 GetIntPart(5.5) >> 6 GetIntPart(-6.5) >> -7
Domyślnie jest zawsze to pierwsze, co może być zaskoczeniem, ale ma bardzo dobry sens .
Twoja wyraźna obsada zrobi:
int intPart = (int)343564564.5 // intPart will be 343564564 int intPart = (int)343564565.5 // intPart will be 343564566
Ze sposobu, w jaki sformułowałeś pytanie, wygląda na to, że to nie jest to, czego chcesz - za każdym razem chcesz je rozwiązać.
Chciałbym zrobić:
Sprawdź również swój rozmiar
decimal
- mogą być dość duże, więc może być konieczne użycie plikulong
.źródło
Wystarczy go rzucić, jako taki:
int intPart = (int)343564564.4342
Jeśli nadal chcesz używać go jako ułamka dziesiętnego w późniejszych obliczeniach, to Math.Truncate (lub prawdopodobnie Math.Floor, jeśli chcesz zachować określone zachowanie dla liczb ujemnych) jest funkcją, której potrzebujesz.
źródło
Bardzo łatwy sposób na oddzielenie wartości od jej części ułamkowej.
double d = 3.5; int i = (int)d; string s = d.ToString(); s = s.Replace(i + ".", "");
s jest częścią ułamkową = 5, a
i jest wartością całkowitą = 3
źródło
(int)Decimal.MaxValue
się przepełni.Mam nadzieję, że ci pomogę.
/// <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)); }
źródło
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
źródło
decimal
jest znacznie większy niż zakresint
. Nie jest to również kwestia VB.