¿Cuál es la mejor manera de devolver la parte entera de un decimal (en c #)? (Esto tiene que funcionar para números muy grandes que pueden no encajar en un int).
GetIntPart(343564564.4342) >> 343564564
GetIntPart(-323489.32) >> -323489
GetIntPart(324) >> 324
El propósito de esto es: Estoy insertando en un campo decimal (30,4) en la base de datos y quiero asegurarme de no intentar insertar un número que sea demasiado largo para el campo. La determinación de la longitud de la parte entera del decimal es parte de esta operación.
Respuestas:
Por cierto chicos, (int) Decimal.MaxValue se desbordará. No puede obtener la parte "int" de un decimal porque el decimal es demasiado grande para ponerlo en el cuadro int. Recién comprobado ... es demasiado grande durante mucho tiempo (Int64).
Si desea que el bit de un valor decimal esté a la IZQUIERDA del punto, debe hacer esto:
y devuelve el valor como ... A DECIMAL o DOBLE.
editar: ¡Truncar es definitivamente la función correcta!
fuente
Creo que System.Math.Truncate es lo que estás buscando.
fuente
Depende de lo que estés haciendo.
Por ejemplo:
//bankers' rounding - midpoint goes to nearest even GetIntPart(2.5) >> 2 GetIntPart(5.5) >> 6 GetIntPart(-6.5) >> -6
o
//arithmetic rounding - midpoint goes away from zero GetIntPart(2.5) >> 3 GetIntPart(5.5) >> 6 GetIntPart(-6.5) >> -7
El valor predeterminado es siempre el primero, lo que puede ser una sorpresa, pero tiene mucho sentido .
Tu elenco explícito servirá:
int intPart = (int)343564564.5 // intPart will be 343564564 int intPart = (int)343564565.5 // intPart will be 343564566
Por la forma en que ha redactado la pregunta, parece que esto no es lo que quiere, quiere decirlo todo el tiempo.
Yo lo haría:
También verifique el tamaño de su
decimal
; pueden ser bastante grandes, por lo que es posible que deba usar un archivolong
.fuente
Solo necesitas lanzarlo, como tal:
int intPart = (int)343564564.4342
Si aún desea usarlo como decimal en cálculos posteriores, entonces Math.Truncate (o posiblemente Math.Floor si desea un cierto comportamiento para números negativos) es la función que desea.
fuente
Manera muy fácil de separar el valor y su valor de parte fraccional.
double d = 3.5; int i = (int)d; string s = d.ToString(); s = s.Replace(i + ".", "");
s es una parte fraccionaria = 5 e
i es un valor entero = 3
fuente
(int)Decimal.MaxValue
se desbordará.Espero ayudarte.
/// <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)); }
fuente
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
fuente
decimal
es mucho mayor que el deint
. Además, esta no es una pregunta de VB.