La mejor manera de obtener parte de un número entero de un número decimal
Pregunta
¿Cuál es la mejor manera de devolver la parte del número entero 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. Determinar la longitud de la parte del número entero del decimal es parte de esta operación.
Solución
Por cierto chicos, (int) Decimal.MaxValue se desbordará. No puede obtener & Quot; int & Quot; parte de un decimal porque el decimal es demasiado grande para ponerlo en el cuadro int. Acabo de comprobar ... es incluso demasiado grande por mucho tiempo (Int64).
Si desea el bit de un valor decimal a la IZQUIERDA del punto, debe hacer esto:
Math.Truncate(number)
y devuelve el valor como ... A DECIMAL o DOUBLE.
editar: ¡Truncar es definitivamente la función correcta!
Otros consejos
Creo que System.Math.Truncate es lo que eres buscando.
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 hará:
int intPart = (int)343564564.5
// intPart will be 343564564
int intPart = (int)343564565.5
// intPart will be 343564566
Por la forma en que ha formulado la pregunta, parece que esto no es lo que quiere, quiere plantearlo todo el tiempo.
Yo haría:
Math.Floor(Math.Abs(number));
También verifique el tamaño de su decimal
- pueden ser bastante grandes, por lo que es posible que necesite usar un long
.
Solo necesita 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.
Una forma muy fácil de separar el valor y su valor parcial fraccionario.
double d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");
s es parte fraccionaria = 5 y
i es un valor como entero = 3
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));
}
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