¿Cómo convertir un doble a un int en Java redondeándolo hacia abajo?

77

Necesito convertir un doble a un int en Java, pero el valor numérico siempre debe redondearse hacia abajo. es decir, 99,99999999 -> 99

badpanda
fuente
posible duplicado de Cómo convertir float a int con Java
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Creo que los flotadores y los dobles son tipos de datos diferentes en Java.
badpanda
Creo que están demasiado cerca porque ambos son tipos primitivos y de punto flotante. Las respuestas son las mismas y es muy probable que sigan siéndolo.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
1
En realidad, la pregunta del punto flotante es preguntar con mayor precisión cómo redondear un flotador (según algún estándar de redondeo no especificado). Esta pregunta, que probablemente podría cambiarse de nombre de manera más apropiada a '¿Cómo redondear un doble hacia cero y convertirlo en int en Java?' es similar a preguntar cómo piso un doble, excepto que el piso se redondea al infinito negativo en lugar de a cero. Las respuestas son bastante diferentes aunque los títulos de las preguntas son similares.
badpanda

Respuestas:

141

La conversión a un int elimina implícitamente cualquier decimal. No es necesario llamar a Math.floor () (asumiendo números positivos)

Simplemente encasilla con (int), por ejemplo:

System.out.println((int)(99.9999)); // Prints 99

Dicho esto, tiene un comportamiento diferente al Math.floorque redondea hacia el infinito negativo (@Chris Wong)

Xorlev
fuente
27
Tenga en cuenta que Math.floor no produzca un resultado diferente para los números negativos que un simple encasillado.
Joey
3
Depende de lo que el OP quiera decir con "redondeo hacia abajo". El elenco lo redondea "hacia abajo" hacia cero, mientras que Math.floor lo redondea hacia el infinito negativo.
Lambda Fairy
5
También tenga en cuenta que un int no puede representar todos los posibles valores enteros que un doble puede. Si desea truncar un valor de doble precisión, conviértalo en un valor entero de 64 bits como long. System.out.println((long)(9.9999e300));
Monroe Thomas
1
Aunque las reglas de redondeo IEEE 754 usan el término truncamiento para redondear hacia cero, y usan los términos sinónimos redondear hacia abajo y piso para redondear hacia el infinito negativo, Java BigDecimaly las RoundingModeclases usan ROUND_DOWNpara redondear hacia cero y ROUND_FLOORredondear hacia cero . infinito negativo.
Andreas
32

Para convertir un doble en un int y redondearlo al entero más cercano (es decir, a diferencia del típico (int)(1.8)y (int)(1.2), que "redondeará hacia abajo" hacia 0 y devolverá 1), simplemente agregue 0.5 al doubleque encasillará en anint .

Por ejemplo, si tenemos

double a = 1.2;
double b = 1.8;

Luego, las siguientes expresiones de encasillado para xey devolverán los valores redondeados hacia abajo ( x = 1y y = 1):

int x = (int)(a);   // This equals (int)(1.2) --> 1
int y = (int)(b);   // This equals (int)(1.8) --> 1

Pero agregando 0.5 a cada uno, obtendremos el resultado redondeado al entero más cercano que podemos desear en algunos casos ( x = 1y y = 2):

int x = (int)(a + 0.5);   // This equals (int)(1.8) --> 1
int y = (int)(b + 0.5);   // This equals (int)(2.3) --> 2

Como pequeña nota , este método también le permite controlar el umbral en el que doublese redondea hacia arriba o hacia abajo al (int)encasillar.

(int)(a + 0.8);

encasillar. Esto solo se redondeará hacia arriba (int)a + 1siempre que los valores decimales sean mayores o iguales a 0,2. Es decir, al agregar 0.8 al doubleinmediatamente anterior al encasillado, 10.15 y 10.03 se redondearán a la baja a 10 en el (int)encasillado, pero 10.23 y 10.7 se redondearán a 11.

JavaDrip
fuente
6
Tienes toda la razón, no es así. Vi que este hilo aparece cuando busca en Google "Java int typecast double", y pensé que alguien que busca una manera de redondear hacia arriba / abajo directamente con el encasillado (int) podría usar esto. Esto no se publica con una cuenta de stackoverflow (por lo que no estoy tratando de mejorar mi reputación, si eso se toma en serio aquí), solo intento ayudar a difundir un truco genial que uso con bastante frecuencia. :) ¡Salud!
JavaDrip
4
Bien, pero recuerde que esto solo funciona con dobles positivos . Por ejemplo, si redondea -0,8 con este truco, el código System.out.println(""+ (int)(-0.8d + 0.5))imprime 0, en lugar de -1 como se esperaba
Gil Vegliach
17

(int)99.99999

Será 99. Lanzar un doble a un int no redondea, descartará la parte fraccionaria.

leeeroy
fuente
11
Math.floor(n)

donde n es un doble. Esto en realidad devolverá un doble, al parecer, así que asegúrese de encasillarlo después.

Austin Fitzpatrick
fuente
2
No es necesario hacer piso antes de lanzar, vea la respuesta de Xorlev.
Mizipzor
6
@miz: Sin embargo, la semántica es diferente para los números negativos.
Joey
5

Esto funciona bien int i = (int) dbl;

fastcodejava
fuente
5

new Double(99.9999).intValue()

Nico.S
fuente
1

prueba con esto, esto es simple

double x= 20.22889909008;
int a = (int) x;

this will return a=20

o prueba con esto: -

Double x = 20.22889909008;
Integer a = x.intValue();

this will return a=20

o prueba con esto: -

double x= 20.22889909008;
System.out.println("===="+(int)x);

this will return ===20

Puede que estos códigos te ayuden.

Amitsharma
fuente
0

Intente usar Math.floor.

John
fuente
0

En esta pregunta:

1. La conversión de doble a entero es una tarea muy fácil.

2.Pero no está redondeando el valor doble al decimal más cercano. Por lo tanto, el casting se puede hacer así:

double d=99.99999999;
int i=(int)d;
System.out.println(i);

y se imprimirá 99, pero no se ha redondeado.

Por lo tanto, para redondear podemos usar,

double d=99.99999999;
System.out.println( Math.round(d));

Esto imprimirá la salida de 100.

R.Nish
fuente