2012-10-04 17 views
10

He siguiente ejemplo (link to ideone).la conversión de una cadena que contiene decimal a largo

long lDurationMillis = 0; 
lDurationMillis = Long.parseLong("30000.1"); 
System.out.print("Play Duration:" + lDurationMillis); 

lanza una excepción:

Exception in thread "main" java.lang.NumberFormatException: For input string: "30000.1" 
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) 
at java.lang.Long.parseLong(Long.java:419) 
at java.lang.Long.parseLong(Long.java:468) 
at Main.main(Main.java:9) 

Pero por qué no me deja convertir ese número en una cadena directamente puedo convertir número a un entero y de convertir al doble?. ¿Pero hay alguna otra manera?

+0

Por qué no convertir el decimal directamente a un '' double' con Double.parseDouble (texto); 'oa un BigDecimal con 'new BigDecimal (text);' –

+0

El título dice conversión de cadena a larga, la primera pregunta es sobre la codificación del número a la cadena, la siguiente declaración sobre la conversión del número a entero a la cadena. Estoy confundido –

+0

No está claro a qué te refieres. PUEDE convertir cualquier número a 'Cadena' con, por ejemplo,' Long.toString (long l) '. –

Respuesta

27

El valor 30000.1 es un valor a largo válido. Se podría analizar el valor doble en primer lugar:

lDurationMillis = (long)Double.parseDouble("30000.1"); 
+1

He leído que usar el tipo de datos 'doble' puede conducir a errores precisos. ¿No podría suceder eso aquí? – Patrick

+0

'parseDouble' hace un personaje muy preciso por la conversión de caracteres por lo que no – Reimeus

2

Debido larga no puede tener parte fraccionaria, podría convertir a duplicar y luego echó a ignorar durante mucho tiempo parte fraccionaria

2

Se puede usar BigDecimal en este caso:

BigDecimal bd = new BigDecimal("30000.1"); 
long l = bd.setScale(0, BigDecimal.ROUND_HALF_UP).longValue(); 
System.out.println(l); 
4

El título dice convertir cadena a largo, la primera pregunta es sobre coverting número de cuerdas, al lado declaración acerca convirtiendo el número en entero en cadena. Estoy confundido.

Pero para nada que ver con puntos flotantes, tengo que señalar en referencia obligada What Every Computer Scientist Should Know About Floating-Point Arithmetic.

en Java, int y long no tienen partes fraccionarias, por lo que una cadena como 3000.1 no se puede covnerted a uno de ellos. Se puede convertir a float o double, pero si lee el artículo anterior, se dará cuenta de que la cobertura puede ser con pérdida, es decir, si puede cambiar ese double de nuevo a String, puede que no obtenga el original 3000.1. Será algo cercano, para la definición apropiada de cerca, pero puede no ser el mismo.

Si desea utilizar una precisión exacta entonces BigDecimal es su amigo. Será mucho más lento que los tipos de números, pero será preciso.

1

Puede usted decir NumberFormat

long lDurationMillis = 0; 
     try{ 
      NumberFormat nf = NumberFormat.getInstance(); 
      lDurationMillis = nf.parse("30000.1").longValue(); 
      System.out.print("Play Duration:" + lDurationMillis); 
     }catch(ParseException e) 
     { 
      e.printStackTrace(); 
     } 

Salida:

Play Duration:30000 
Cuestiones relacionadas