Лучший способ получить целую часть десятичного числа
Вопрос
Как лучше всего вернуть целую часть десятичного числа (в С#)?(Это должно работать для очень больших чисел, которые могут не поместиться в целое число).
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