Pregunta

Recibo un problema extraño al analizar un valor doble en C++ administrado.Puede ser que esté haciendo algo mal.Cuando lo hago:

double value = 0.006;
result = Math::Parse( value)

La salida del resultado es 0.006000000000001.¿Por qué se agrega un 1?

Además, cuando redondeo el valor a 5 decimales, falla.Estoy haciendo:

result2 = Math::Round(result, 5)

Pero result2 es siempre 0.006000000000001.¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Es normal. Este problema causado por el formato IEEE de doble - real 0.006 se representa como aproximación de fracción binaria infinita. Así que hay 3 formas -

  • Uso de formateo de cadena relacionada con la salida
  • utilizar tipo decimal
  • No utilice == para comparar números, en lugar de utilizar con error constante, por ejemplo: (X -0,06)

Otros consejos

Esto se debe a la precisión.le di esta respuesta aquí:

Los flotadores y los dobles son números representaciones con un cierto precisión.No todos los valores pueden ser representados en este formato.Ver aquí también.

Puedes pensar fácilmente por qué esto Sea el caso:hay un número ilimitado de número de número justo en el intervalo (1..1), pero un float solo tiene un número de bits para representar todos los números en (-MAXFLOAT.. MAXFLOAT).

Dicho más acertadamente:en un entero de 32 bits representación hay un contable número de enteros a representar, Pero hay un infinito e innumerable número de valores reales que no pueden ser plenamente representada en un representación de 32 o 64 bits.Por lo tanto, no sólo hay un límite para el más alto y el más bajo representables valor real, sino también a la precisión.

Entonces, ¿por qué un número que tiene poco dígitos después de la coma flotante ¿afectado?Debido a que la representación se basa en un sistema binario en lugar de un decimal, haciendo que otros números sean fácilmente representados entonces los decimales.

Los números de doble precisión son esencialmente aproximaciones, y con frecuencia tienen colas que no puede deshacerse de -. Es decir, no hay manera de expresar el número más exactamente

Es posible obtener resultados más como se puede esperar si utiliza decimal - que todavía es una aproximación, pero se utiliza de base 10, por lo que tiende a comportarse más como la gente espera. Pero debido a que no se asigna a un tipo de CPU, es más lento.

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