La mejor manera de obtener parte de un número entero de un número decimal


¿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 que no intento 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.

Author: Wai Ha Lee, 2009-01-26

6 answers

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. Acabo de comprobarlo... su incluso demasiado grande para un largo (Int64).

Si desea el bit de un valor decimal a la IZQUIERDA del punto, debe hacer esto:

Math.Truncate(number)

Y devuelve el valor as... Un DECIMAL o un DOBLE.

editar: Truncar es definitivamente la función correcta!

 168
Author: Will,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-21 12:26:00

Creo que Sistema.Matemáticas.Truncate es lo que estás buscando.

 22
Author: Mark Carpenter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-26 13:32:05

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.

Su 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 has redactado la pregunta, suena como que esto no es lo que quieres, quieres hacerlo 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 deba usar un long.

 3
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-26 13:26:10

Solo necesitas lanzarlo, como tal:

int intPart = (int)343564564.4342

Si todavía desea usarlo como decimal en cálculos posteriores, entonces Matemáticas.Truncar (o posiblemente Matemáticas.Piso si desea un cierto comportamiento para los números negativos) es la función que desea.

 0
Author: Noldorin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-26 13:03:21

Forma muy fácil de separar el valor y su valor de parte fraccionaria.

double  d = 3.5;
int i = (int)d;
string s = d.ToString();
s = s.Replace(i + ".", "");

S es parte fraccionaria = 5 y
i es valor como entero = 3

 0
Author: Amit Gohel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-17 12:46:49
   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
 -2
Author: Mattheu Norwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-09 14:49:48