Extraire des chiffres individuels d’un float

Je me suis cogné la tête toute la journée. Le projet C ++ sur lequel je travaille actuellement doit impérativement afficher une valeur modifiable. Le chiffre actuellement sélectionné affiche la valeur incrémentée ci-dessus et la valeur décrémentée ci-dessous pour ledit chiffre. Il est utile de pouvoir référencer la valeur modifiable sous forme de nombre et de collection de chiffres. Ce qui serait génial, c’est qu’il existe une forme indexable d’un nombre à virgule flottante, mais j’ai été incapable de trouver une telle solution. Je pose cette question là-bas pour voir s’il y a quelque chose d’évident qui me manque ou si je devrais me lancer moi-même.


Merci pour le conseil! J’espérais une solution qui ne convertirait pas float -> ssortingng -> int, mais je pense que c’est le meilleur moyen de s’affranchir des problèmes de quantification à virgule flottante. J’ai fini par utiliser boost :: format et me contenter de référencer les caractères individuels de la chaîne. Je ne vois pas cela comme une énorme différence de performances par rapport à l’utilisation de combinaisons de modf et de fmod pour tenter d’obtenir un chiffre dans un flottant (c’est probablement ce qui se passe dans les coulisses, mais plus robuste que mon implémentation).

La représentation interne des nombres à virgule flottante ne ressemble pas à ce que vous voyez. Vous ne pouvez lancer que très fort.

Pour lancer, faites ceci:

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

Ou voir ceci: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1

L’article de Wikipédia peut en dire plus sur la représentation: http://en.wikipedia.org/wiki/Floating_point

Oh, il y a plusieurs façons de convertir une chaîne. (Bien que je préfère m’imprimer moi-même.)

Vous pouvez également convertir en int et extraire les chiffres avec module et division entière. Vous pouvez compter le nombre de chiffres avec log {base10}.

(Rappelez-vous: log {baseA} _X / log {baseA} _B = log {baseB} _X.)

Exemple:

 #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) ); } 

Bien que vous deviez utiliser static_cast ...

Attention à la notation exponentielle. Avec un très grand ou un très petit nombre, vous pouvez avoir un problème.

Les nombres à virgule flottante ont également des problèmes arrondis qui peuvent vous causer du chagrin. (C’est la même raison pour laquelle nous n’utilisons pas opérateur == entre deux doubles. Ou pourquoi vous ne pouvez pas compter sur a * b == b * a. Selon les valeurs exactes de a & b, elles peuvent différer très légèrement. environ 10 ^ -25.)

Vous pouvez lancer entre ssortingng et float uniquement en utilisant boost :: lexical_cast. Toutefois, vous ne pouvez pas indexer directement le formulaire flottant – il n’est pas stocké en interne sous forme de chiffres décimaux. Ce n’est probablement pas un problème. De toute façon, pour votre interface utilisateur, vous conserverez probablement une forme de chaîne du nombre, avec des conversions vers et depuis float dans le getter / setter.