Estoy trabajando con una aplicación que está basada completamente en dobles, y estoy teniendo problemas en un método de utilidad que analiza una cadena en un doble. Encontré una solución donde el uso de BigDecimal para la conversión resuelve el problema, pero plantea otro problema cuando voy a convertir el BigDecimal en un doble: estoy perdiendo varios lugares de precisión. Por ejemplo:perdiendo la conversión de precisión de BigDecimal java a doble
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class test {
public static void main(String [] args){
String num = "299792.457999999984";
BigDecimal val = new BigDecimal(num);
System.out.println("big decimal: " + val.toString());
DecimalFormat nf = new DecimalFormat("#.0000000000");
System.out.println("double: "+val.doubleValue());
System.out.println("double formatted: "+nf.format(val.doubleValue()));
}
}
Esto produce el siguiente resultado:
$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
La doble formato demuestra que se pierde la precisión después de la tercera posición (la aplicación requiere que los lugares más bajos de precisión).
¿Cómo puedo obtener BigDecimal para conservar esos lugares adicionales de precisión?
Gracias!
Actualizar después de alcanzar esta publicación. Varias personas mencionan que esto excede la precisión del tipo de datos dobles. A menos que esté leyendo esta referencia incorrectamente: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 entonces el doble primitiva tiene un valor máximo exponencial de E max = 2K-1 -1, y la implementación estándar tiene K = 11. Entonces, el máximo exponente debería ser 511, ¿no?
casi justo; cambie el modo de redondeo, y ha resuelto el problema del OP – Anon
@Anon: ¿De qué está hablando? No hay solución para el problema del OP usando un 'doble'. – WhiteFang34
Vea mi respuesta, o vuelva a leer la pregunta del OP para comprender su problema al perder los 9 – Anon