Pregunta

He estado golpeando mi cabeza con esto todo el día. El proyecto C ++ en el que estoy trabajando actualmente tiene el requisito de mostrar un valor editable. El dígito seleccionado actualmente muestra el valor incrementado arriba y el valor disminuido abajo para dicho dígito. Es útil poder hacer referencia al valor editable como un número y una colección de dígitos. Lo que sería asombroso es si hubiera alguna forma indexable de un número de coma flotante, pero no he podido encontrar esa solución. Estoy lanzando esta pregunta para ver si hay algo obvio que me estoy perdiendo o si simplemente debo rodar la mía.


¡Gracias por el consejo! Esperaba una solución que no se convirtiera de flotante - > cadena - > int, pero creo que creo es la mejor manera de alejarse de los problemas de cuantificación de coma flotante. Terminé con el formato boost :: y solo haciendo referencia a los caracteres individuales de la cadena. No puedo ver que sea una gran diferencia de rendimiento en comparación con el uso de combinaciones de modf y fmod para intentar sacar un dígito de un flotador (probablemente lo haga detrás de escena, solo de manera más sólida que mi implementación).

¿Fue útil?

Solución

La representación interna de los números de coma flotante no es como se ve. Solo puedes lanzar a un revoltijo.

Para emitir, haz esto:

char string[99];
sprintf(string,"%f",floatValue);

O vea esto: http: // www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

El artículo de Wikipedia puede explicar más sobre la representación: http://en.wikipedia.org/wiki/ Floating_point

Otros consejos

Oh, hay muchas formas de convertir a una cadena. ( Aunque prefiero s n printf () yo mismo.)

O podría convertir a un int y extraer los dígitos con módulo y división entera. Puede contar la cantidad de dígitos con log {base10}.

(Recuerde: log {baseA} _X / log {baseA} _B = log {baseB} _X.)

Ejemplo:

#define SHOW(X) cout << # X " = " << (X) << endl

int
main()
{
  double d = 1234.567;

  SHOW( (int(d)%10000) / 1000 );
  SHOW( (int(d)%1000)  / 100  );
  SHOW( (int(d)%100)   / 10   );
  SHOW( (int(d)%10)           );
  SHOW( (int(d*10)  % 10)     );
  SHOW( (int(d*100) % 10)     );
  SHOW( (int(d*1000)% 10)     );

  SHOW( log(d)/log(10) );
}

Aunque deberías usar static_cast ...

Cuidado con la notación exponencial. Con números muy grandes o muy pequeños, puede tener un problema.

Los números de coma flotante también tienen problemas de redondeo que pueden causarle cierta pena. (Es la misma razón por la que no usamos operator == entre dos dobles. O por qué no puede confiar en a * b == b * a. Dependiendo de los valores exactos de a & amp; b, pueden diferir mucho ligeramente fuera alrededor de 10 ^ -25.)

Puede lanzar entre cadenas y flotantes solo usando boost :: lexical_cast. Sin embargo, no puede indexar directamente la forma flotante: internamente no se almacena como dígitos decimales. Esto probablemente no sea un gran problema. Para su interfaz de usuario, lo más probable es que mantenga una forma de cadena del número de todos modos, con conversiones hacia y desde flotante en el captador / configurador.

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