Как лучше всего вернуть целую часть десятичной дроби (в С #)? (Это должно работать для очень больших чисел, которые могут не поместиться в int).
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
Цель этого: я вставляю десятичное (30,4) поле в базе данных и хочу убедиться, что я не пытаюсь вставить число, превышающее длину поля. Частью этой операции является определение длины целой части десятичной дроби.
Ответы:
Кстати, ребята, (int) Decimal.MaxValue переполнится. Вы не можете получить "int" часть десятичной дроби, потому что десятичная дробь слишком велика, чтобы помещать ее в поле int. Только что проверил ... он даже великоват надолго (Int64).
Если вы хотите, чтобы бит десятичного значения был слева от точки, вам нужно сделать следующее:
и верните значение как ... ДЕСЯТИЧНОЕ или ДВОЙНОЕ.
edit: 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
Судя по тому, как вы сформулировали вопрос, похоже, что это не то, что вам нужно - вы хотите каждый раз отказываться от этого.
Я бы сделал:
Также проверьте размер вашего
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, а
i - целое число = 3
источник
(int)Decimal.MaxValue
произойдет переполнение.Надеюсь помочь вам.
/// <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
источник
decimal
намного больше, чем уint
. Кроме того, это не вопрос VB.