Лучший способ получить целую часть десятичного числа

StackOverflow https://stackoverflow.com/questions/479706

  •  20-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Если вы хотите, чтобы бит десятичного значения находился СЛЕВА от точки, вам нужно сделать следующее:

Math.Truncate(number)

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

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

Другие советы

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

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

Например:

//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.

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

int intPart = (int)343564564.4342

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

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

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

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

Я надеюсь помочь вам.

/// <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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top