Лучший способ получить целую цифру десятичного числа
Каков наилучший способ возврата целой числовой части десятичного числа (в С#)? (Это должно работать для очень больших чисел, которые могут не вписываться в int).
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
Целью этого является: я вставляю в десятичное (30,4) поле в db и хочу убедиться, что я не пытаюсь вставить число, которое слишком велико для поля. Определение длины целой числовой части десятичной дроби является частью этой операции.
Ответы
Ответ 1
Кстати, ребята, (int) Decimal.MaxValue будут переполняться. Вы не можете получить "int" часть десятичного числа, потому что десятичное значение слишком велико, чтобы помещать int-код. Просто проверил... его даже слишком большой для долгого (Int64).
Если вы хотите, чтобы бит десятичного значения был равен LEFT для точки, вам нужно сделать следующее:
Math.Truncate(number)
и вернуть значение как... A DECIMAL или DOUBLE.
edit: Truncate определенно является правильной функцией!
Ответ 2
Я думаю, System.Math.Truncate - это то, что вы ищете.
Ответ 3
Зависит от того, что вы делаете.
Например:
//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
.
Ответ 4
Вам просто нужно бросить его, как таковое:
int intPart = (int)343564564.4342
Если вы все еще хотите использовать его в качестве десятичного числа в последующих вычислениях, то Math.Truncate(или, возможно, Math.Floor, если вы хотите определенное поведение для отрицательных чисел) - это функция, которую вы хотите.
Ответ 5
Очень простой способ разделить значение и его дробную часть.
double d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");
s - дробная часть = 5 и
i - целое число = 3
Ответ 6
Я надеюсь помочь вам.
/// <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));
}
Ответ 7
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