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)
Tenga en cuenta que Math.floorno 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) --> 1int 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) --> 1int 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.
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.
Respuestas:
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.floor
que redondea hacia el infinito negativo (@Chris Wong)fuente
Math.floor
no produzca un resultado diferente para los números negativos que un simple encasillado.System.out.println((long)(9.9999e300));
BigDecimal
y lasRoundingMode
clases usanROUND_DOWN
para redondear hacia cero yROUND_FLOOR
redondear hacia cero . infinito negativo.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 aldouble
que 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 = 1
yy = 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 = 1
yy = 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
double
se redondea hacia arriba o hacia abajo al(int)
encasillar.(int)(a + 0.8);
encasillar. Esto solo se redondeará hacia arriba
(int)a + 1
siempre que los valores decimales sean mayores o iguales a 0,2. Es decir, al agregar 0.8 aldouble
inmediatamente 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.fuente
System.out.println(""+ (int)(-0.8d + 0.5))
imprime 0, en lugar de -1 como se esperaba(int)99.99999
Será 99. Lanzar un doble a un int no redondea, descartará la parte fraccionaria.
fuente
donde n es un doble. Esto en realidad devolverá un doble, al parecer, así que asegúrese de encasillarlo después.
fuente
Esto funciona bien
int i = (int) dbl;
fuente
new Double(99.9999).intValue()
fuente
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.
fuente
Intente usar Math.floor.
fuente
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
.fuente