¿Cómo generar números de coma flotante en el formato original en C ++?

StackOverflow https://stackoverflow.com/questions/1431144

  •  07-07-2019
  •  | 
  •  

Pregunta

Es una práctica de codificación. Leo estos números como double de un archivo:
112233 445566
8717829120000 2.4
16000000 1307674.368
10000 2092278988.8
1234567 890123
Después de algunos cálculos, debería mostrar algunos de ellos. Quiero que aparezcan igual que en el archivo, sin ceros de relleno, sin notación científica, ¿cómo podría lograrlo? ¿Tengo que leer como cadena y luego convertirlos?

Editar: Erm ... ¿Quieren decir que en realidad no hay forma de que el programa sepa cómo se ven los números originalmente?

¿Fue útil?

Solución

Si desea que la salida sea idéntica a la entrada, entonces sí, debe leerlos como cadenas y almacenar las cadenas para que salgan más tarde.

¿Por qué? Cuando se trata de números de coma flotante, la computadora no puede representar la mayoría de las partes fraccionarias decimales exactamente en binario. Entonces, en un número como 2.4, la representación interna no será exactamente 2.4, será ligeramente diferente. La mayoría de las veces, las bibliotecas de E / S C / C ++ tomarán dicho número binario e imprimirán 2.4, pero para algunos números, podrían imprimir algo como 2.40000000001 o 2.399999999.

Entonces, es por eso que desea mantener las cadenas originales alrededor.

Otros consejos

No hay una forma integrada de hacer esto. Sí, deberá mantener la representación original y algún vínculo entre esa representación y el número analizado (un map<string, double> por ejemplo).

Si necesita generar los números originales como estaban, es mejor que guarde las cadenas originales en algún lugar. Durante el decimal - & Gt; binario - > conversión decimal, se puede perder algo de precisión, debido a los límites de precisión del doble. No puede terminar imprimiendo exactamente los mismos dígitos decimales.

Los lees como cadenas, registras todos los aspectos delicados (¿tienen partes decimales, cuánto tiempo, cualquier cero de relleno, etc., etc.) y recuerdas todos esos aspectos para cada campo, conviértelos en números si es absolutamente necesario , luego use todo el pequeño aspecto loco que almacenó al formatear los números para la salida nuevamente. Loco, pero la única forma de lograr literalmente lo que estás pidiendo.

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