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.

Author: Wai Ha Lee, 2009-01-26

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ą!

 168
Author: Will,
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.

 22
Author: Mark Carpenter,
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.

 3
Author: Keith,
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.

 0
Author: Noldorin,
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

 0
Author: Amit Gohel,
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
 -2
Author: Mattheu Norwood,
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