Pregunta

Estoy usando java y me refiero al " double " tipo de datos. Para abreviar, estoy leyendo algunos valores de la entrada estándar que leí en mi código como dobles (preferiría usar algo como BigInteger pero en este momento no es posible).

Espero obtener valores dobles del usuario, pero a veces pueden ingresar cosas como: 999999999999999999999999999.9999999999 que creo que está más allá de una representación precisa para doble y obtener redondeado a 1.0E27 (probablemente).

Me gustaría obtener algunos consejos sobre cómo detectar si un valor específico no podría representarse con precisión en un doble y requeriría redondeo (para poder rechazar ese valor u otras acciones similares).

Muchas gracias

¿Fue útil?

Solución

La mayoría de los valores ingresados ??por humanos no serán exactamente representables con un doble.

Por ejemplo, ¿desea evitar que el usuario ingrese 0.1? Eso no es exactamente representable como un doble.

Para encontrar la escala del error, puede hacer algo como:

BigDecimal userAsDecimal = new BigDecimal(userInput);
double userAsDouble = double.parseDouble(userInput);
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble);
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs();

Luego verifique si " error " es tolerablemente pequeño.

Otros consejos

double orig = GetSomeDouble();
double test1 = orig - 1;
if ( orig == test1 )
   SomethingIsWrong();
double test2 = test1 + 1;
if ( orig != test2 )
   SomethingIsWrong();

No puede usar un doble para almacenar algo precisamente en la forma en que está preguntando, muy raramente un usuario puede ingresar un número que un doble puede representar perfectamente, pero eso sería solo una coincidencia. Si necesita almacenar el número exacto, puede usar una cadena siempre que no necesite hacer ninguna manipulación. Si necesita más que eso, entonces probablemente haya bibliotecas hechas para ese tipo de matemática precisa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top