Najlepszy sposób na uzyskanie części liczby całkowitej liczby dziesiętnej
Jaki jest najlepszy sposób na zwrócenie części liczby całkowitej dziesiętnej (w c#)? (Musi to dział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 db i chcę się upewnić, że nie próbuję wstawiać liczby, która jest zbyt długa dla pola. Określenie długości części liczby całkowitej dziesiętnej jest częścią tej operacji.
6 answers
Przy okazji chłopaki, (int)dziesiętne.MaxValue się przepełni. Nie można uzyskać części" int " dziesiętnego, ponieważ dziesiętny jest zbyt friggen duży, aby umieścić w polu int. Właśnie sprawdziłem... jego nawet za duży na długi (Int64).
Jeśli chcesz, aby bit wartości dziesiętnej był po lewej stronie kropki, musisz to zrobić:
Math.Truncate(number)
I zwraca wartość jako... Dziesiętne lub podwójne.
edit: Truncate jest zdecydowanie poprawną funkcją!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-21 12:26:00
Myślę, że System.Matematyka.Truncate jest tym, czego szukasz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 13:32:05
Zależy, 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ślnym 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
Z tego, jak sformułowałeś pytanie, brzmi, jakby to nie było to, czego chcesz.
Zrobiłbym:
Math.Floor(Math.Abs(number));
Sprawdź również rozmiar swojego decimal
- mogą być dość duże, więc może być konieczne użycie long
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 13:26:10
Wystarczy rzucić, jako takie:
int intPart = (int)343564564.4342
Jeśli nadal chcesz używać go jako dziesiętnego w późniejszych obliczeniach, to Math.Truncate (lub ewentualnie Math.Floor, jeśli chcesz mieć pewne zachowanie dla liczb ujemnych) jest funkcją, którą chcesz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-26 13:03:21
Bardzo łatwy sposób oddzielenia wartości od wartości 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 i
i is value as integer = 3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-17 12:46:49
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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-09 14:49:48