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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top