Cualquier forma de fundido java.lang.Double
a java.lang.Integer
?
Lanza una excepción
"java.lang.ClassCastException: java.lang.Double incompatible con java.lang.Integer"
A Double
no es un Integer
, por lo que el elenco no funcionará. Tenga en cuenta la diferencia entre la Double
clase y la double
primitiva . También tenga en cuenta que a Double
es a Number
, por lo que tiene el método intValue
, que puede usar para obtener el valor como primitivo int
.
intValue()
entonces.intValue()
, solo convierte eldouble
aint
.Debe obtener explícitamente el valor int utilizando el método intValue () de esta manera:
O
fuente
2^31 - 1 (Integer.MAX_VALUE)
se desbordará.1.6 -> 1
,1.4 -> 1
,-1.6 -> -1
,-1.4 -> -1
,Creo que es imposible entender las otras respuestas sin cubrir las trampas y el razonamiento detrás de esto.
No se puede lanzar directamente
Integer
a unDouble
objeto. TambiénDouble
yInteger
son objetos inmutables, por lo que no puede modificarlos de ninguna manera.Cada clase numérica tiene una alternativa primitiva (
Double
vsdouble
,Integer
vsint
, ...). Tenga en cuenta que estas primitivas comienzan con un carácter en minúscula (por ejemploint
). Eso nos dice que no son clases / objetos. Lo que también significa que no tienen métodos. Por el contrario, las clases (pInteger
. Ej. ) Actúan como cajas / envoltorios alrededor de estas primitivas, lo que hace posible usarlas como objetos.Estrategia:
Para convertir un
Double
aInteger
, necesitaría seguir esta estrategia:Double
objeto en un primitivodouble
. (= "unboxing")double
en primitivoint
. (= "casting")int
nuevo en unInteger
objeto. (= "boxeo")En codigo:
En realidad hay un atajo. Puede desempaquetar inmediatamente de un
Double
directo a un primitivoint
. De esa manera, puede omitir el paso 2 por completo.Trampas:
Sin embargo, hay muchas cosas que no están cubiertas en el código anterior. El código anterior no es nulo-seguro.
Ahora funciona bien para la mayoría de los valores. Sin embargo, los enteros tienen un rango muy pequeño (valor mínimo / máximo) en comparación con a
Double
. Además de eso, los dobles también pueden contener "valores especiales", que los enteros no pueden:Por lo tanto, dependiendo de la aplicación, es posible que desee agregar algo de filtrado para evitar Excepciones desagradables.
Entonces, la siguiente deficiencia es la estrategia de redondeo. Por defecto, Java siempre se redondeará hacia abajo. Redondear tiene sentido en todos los lenguajes de programación. Básicamente, Java está tirando algunos de los bytes. En las aplicaciones financieras seguramente querrá usar el redondeo a medias (por ejemplo:
round(0.5) = 1
yround(0.4) = 0
).Auto- (un) boxeo
Podría estar tentado a usar auto- (un) boxeo en esto, pero no lo haría. Si ya está atrapado ahora, entonces los siguientes ejemplos tampoco serán tan obvios. Si no comprende el funcionamiento interno del auto- (des) boxeo, no lo use.
Supongo que lo siguiente no debería ser una sorpresa. Pero si es así, es posible que desee leer algún artículo sobre cómo transmitir contenido en Java.
Valor preferido de:
Además, no se sienta tentado a usar el
new Integer()
constructor (como lo proponen algunas otras respuestas). LosvalueOf()
métodos son mejores porque usan el almacenamiento en caché. Es una buena costumbre usar estos métodos, porque de vez en cuando le ahorrarán algo de memoria.fuente
Veo tres posibilidades. Los dos primeros cortan los dígitos, el último se redondea al número entero más cercano.
fuente
Me gusta esto:
fuente
De hecho, la forma más sencilla es usar
intValue()
. Sin embargo, esto simplemente devuelve la parte entera; No hace ningún redondeo. Si desea el número entero más cercano al valor doble, deberá hacer esto:Y no olvide el caso nulo:
Math.round()
maneja casos extraños de pato, como infinito y NaN, con relativa gracia.fuente
fuente
Simplemente hazlo de esta manera ...
fuente
También se debe agregar que funciona con autoboxing.
De lo contrario, obtienes un int (primitivo) y luego puedes obtener un Integer desde allí:
fuente
new Integer(int)
, en su lugar useInteger.valueOf(int)
, que tiene un caché para enteros pequeños, como este.Llama
intValue()
a tuDouble
objeto.fuente
Puede hacerlo mediante el uso de "Conversión de tipo estrecha o explícita", doble → largo → int. Espero que funcione.
PD: Dará 0 ya que el doble tiene todos los valores decimales y nada en el lado izquierdo. En el caso de 0.58, lo reducirá a 0. Pero para otros hará la magia.
fuente
Prueba este
fuente
Double e Integer son clases de contenedor para primitivas Java para double e int respectivamente. Puedes lanzar entre esos, pero perderás el punto flotante. Es decir, 5.4 lanzado a un int será 5. Si lo devuelve, será 5.0.
fuente
Simplemente use el método intValue de Double
fuente
Usa el
doubleNumber.intValue();
método.fuente
Memoria eficiente, ya que compartirá la instancia ya creada de Double.
fuente
Math.floor(...)
?intValue()
Siempre pisos de todos modos.Me ha funcionado. Prueba esto:
fuente