Лучший способ получить целую часть десятичного числа - PullRequest
74 голосов
/ 26 января 2009

Каков наилучший способ вернуть целую часть десятичной дроби (в c #)? (Это должно работать для очень больших чисел, которые могут не вписываться в int).

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

Цель этого заключается в следующем: я вставляю в десятичное (30,4) поле в БД и хочу убедиться, что я не пытаюсь вставить число, которое слишком длинное для поля. Определение длины десятичной части целого числа является частью этой операции.

Ответы [ 6 ]

182 голосов
/ 26 января 2009

Кстати, ребята, (int) Decimal.MaxValue переполнится. Вы не можете получить "int" часть десятичной дроби, потому что десятичная дробь слишком большая, чтобы поместить ее в поле int Только что проверил ... его даже слишком долго (Int64).

Если вы хотите, чтобы бит десятичного значения был влево от точки, вам нужно сделать это:

Math.Truncate(number)

и вернуть значение как ... ДЕСЯТИЧНЫЙ или ДВОЙНОЙ.

edit: Truncate - определенно правильная функция!

22 голосов
/ 26 января 2009

Я думаю System.Math.Truncate - это то, что вы ищете.

3 голосов
/ 26 января 2009

Зависит от того, что вы делаете.

Например:

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

или

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

По умолчанию всегда используется первое, что может быть сюрпризом, но имеет очень хороший смысл .

Ваше явное приведение будет делать:

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

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

Судя по тому, как вы сформулировали вопрос, звучит так, будто это не то, что вам нужно - вы хотите говорить об этом каждый раз.

Я бы сделал:

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

Также проверьте размер ваших decimal - они могут быть довольно большими, поэтому вам может потребоваться использовать long.

0 голосов
/ 09 мая 2017
   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
0 голосов
/ 17 октября 2015

Очень простой способ разделения значения и его дробной части.

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

s является дробной частью = 5 и
я значение как целое число = 3

0 голосов
/ 26 января 2009

Вам просто нужно разыграть его, как таковое:

int intPart = (int)343564564.4342

Если вы все еще хотите использовать его в качестве десятичного числа в последующих вычислениях, тогда вам нужна функция Math.Truncate (или, возможно, Math.Floor, если вы хотите определенное поведение для отрицательных чисел).

...