2011-06-24 22 views
92

En Java, quiero convertir un doble a un entero, sé que si usted hace esto:conversión doble de número entero en java

double x = 1.5; 
int y = (int)x; 

que presentamos lo mejor y = 1. Si hace esto:

int y = (int)Math.round(x); 

probablemente obtendrá 2. Sin embargo, me pregunto: desde dobles representaciones de números enteros a veces se ven como 1,9999999998 o algo así, ¿existe la posibilidad de que echando una doble creados a través de Math.round() aún resultará en un número de reducción truncado, en lugar del número redondeado que estamos buscando (es decir: 1 en lugar de 2 en el código como se representa)?

(y sí, me refiero a que, como tal: ¿Hay cualquier valor para x, donde y mostrará un resultado que es un truncada en lugar de una representación cabal de x?)

Si es así: ¿Hay una manera mejor de convertir un doble en un int redondeado sin correr el riesgo de truncamiento?


Robusto algo: Math.round (x) devuelve un largo, no una doble. Por lo tanto: es imposible para Math.round() devolver un número que se parezca a 3.9999998. Por lo tanto, int (Math.round()) nunca necesitará truncar nada y siempre funcionará.

+4

Math.round (doble) devuelve un largo, no un doble. – qbert220

Respuesta

79

¿Existe la posibilidad de que lanzar un doble creado a través de Math.round() se siguen produciendo en un truncado por número

No, round() será siempre alrededor de su doble en el valor correcto, y luego, será lanzar a un long que truncará las posiciones decimales. Pero después del redondeo, no quedará ninguna parte fraccionaria.

Éstos son los documentos desde Math.round(double):

Devuelve el más cercano a la larga discusión. El resultado se redondea a un entero agregando 1/2, tomando la palabra del resultado y lanzando el resultado para escribir largo. En otras palabras, el resultado es igual al valor de la expresión:

(long)Math.floor(a + 0.5d) 
+3

Lo importante es que el redondeo se realiza dentro del método circular. Se devuelve un valor largo, que se puede convertir de forma segura en un int (suponiendo que el valor devuelto siempre estará dentro del rango interno). – qbert220

+0

Sí. No puedo imaginar a/long/to int dando problemas. ¡Obviamente! Debería haber pensado esto :( – vdMandele

+1

Si bien es cierto que el truncamiento no ocurrirá debido al redondeo, aún así puede no obtener los resultados esperados simplemente debido al lanzamiento desde el doble, que es un número muy grande '[max double: 1.7976931348623157E308 ] 'to int que es mucho más pequeño' [max int: 2147483647] '. Solo algo a tener en cuenta. –

-7
double a = 1.450; 

String sa = String.valueOf(a); 
int lengthUntilPoint = sa.indexOf(".")+1; 
int power = sa.length() - lengthUntilPoint; 
int ia = (int) (a* Math.pow(10, power)); 
+3

Si bien este código puede ser interesante para aprender algunos conceptos básicos de la manipulación de cadenas, en realidad no es adecuado aquí. No solo por el uso de tiempo y memoria, sino que es incorrecto. http://docs.oracle.com/javase/8/docs/api/java/lang/Double.html#toString-double- Si miras, verás eso para algunos números '.' charecter no separa unidades y décimas, sino el dígito más grande y el segundo más significativo. – v010dya

12

Para el tipo de datos Double a int, puede utilizar el siguiente:

Double double = 5.00; 

int integer = double.intValue(); 
+0

Él está buscando un valor redondeado. – EJP

0
Double perValue = 96.57; 
int roundVal= (int) Math.round(perValue); 

Resolvió mi propósito.

Cuestiones relacionadas