Je sais que la plupart des langages de programmation ont des fonctions intégrées pour faire cela pour vous, mais comment fonctionnent ces fonctions?comment convertir un double en une chaîne?
Répondre
Un simple (mais de façon non générique, naïve et lente):
- convertir le nombre à un nombre entier, puis diviser cette valeur par 10 étapes pour trouver ses chiffres dans l'ordre inverse. Concaté les ensemble et vous avez la représentation entière.
- soustrayez l'entier du nombre d'origine, multipliez maintenant par 10 pas à pas et trouvez les chiffres après le point décimal. Concatène la première chaîne avec un point et cette deuxième chaîne.
Cela a quelques problèmes, bien sûr:
- lent comme l'enfer;
- ne fonctionne pas pour les nombres négatifs;
- ne vous donnera pas de notation exponentielle pour les nombres très petits ou grands.
Dans l'ensemble, c'est une idée, mais pas une très bonne idée; Je soupçonne qu'il n'y a pas de langages de programmation qui le font.
J'ai vu du code C qui ne fait que lancer un double et accéder directement aux bits. (Si je me souviens bien, c'était la fameuse fonction invsqrt() optimisée du moteur Quake). Mais le problème est, que vous auriez à traiter tous ces cas de frontière (NaN, Inf, etc.) directement et la spécification n'est pas si courte à lire/implémenter;) – tux21b
Comme Oded mentionné dans un commentaire, différentes langues le feront de différentes manières. A titre d'exemple, here's how Ruby 1.9 does it (en C). Votre meilleur pari, tout comme un exercice de recherche, sera de se pencher sur les langages open-source et de voir comment ils le font.
Donc Ruby appelle fondamentalement printf, ce qui est à peine la langue agnostique. – Jess
Le javadoc sur la méthode Double toString() est assez complet:
Crée une représentation de chaîne de la double argument. Tous les caractères mentionnés ci-dessous sont des caractères ASCII.
- Si l'argument est NaN, le résultat est la chaîne "NaN".
- Sinon, le résultat est une chaîne qui représente le signe et la magnitude (valeur absolue) de l'argument. Si le signe est négatif, le premier caractère du résultat est '-' ('-'); si le signe est positif, aucun caractère de signe n'apparaît dans le résultat. En ce qui concerne la grandeur m:
- Si m est l'infini, il est représenté par les caractères "Infinity"; ainsi, l'infini positif produit le résultat "Infini" et l'infini négatif produit le résultat "-Infinité".
- Si m vaut zéro, il est représenté par les caractères "0.0"; ainsi, le zéro négatif produit le résultat "-0.0" et le zéro positif produit le résultat "0.0". Si m est supérieur ou égal à 10^-3 mais inférieur à 10^7, alors il est représenté comme la partie entière de m, sous forme décimale sans zéros, suivi de '.' (.), suivi d'un ou plusieurs chiffres décimaux représentant la partie fractionnaire de m.
- Si m est inférieur à 10^-3 ou supérieur à 10^7, alors il est représenté sous la forme d'une "notation scientifique informatisée". Soit n l'entier unique tel que 10^n < = m < 10^(n + 1); alors soit a le quotient mathématiquement exact de m et 10^n de sorte que 1 < = a < 10. La grandeur est alors représentée comme la partie entière de a, sous la forme d'un seul chiffre décimal, suivi de '.' (.), suivi de chiffres décimaux représentant la partie fractionnaire de a, suivi de la lettre 'E' (E), suivie d'une représentation de n sous la forme d'un nombre décimal entier, tel que produit par la méthode Integer.toString (int).
Combien de chiffres doivent être imprimés pour la partie fractionnaire de m ou a? Il doit y avoir au moins un chiffre pour représenter la partie fractionnaire, et au-delà autant, mais seulement autant, plus de chiffres que nécessaire pour distinguer de façon unique la valeur de l'argument des valeurs adjacentes de type double. C'est-à-dire, supposons que x est la valeur mathématique exacte représentée par la représentation décimale produite par cette méthode pour un argument fini non nul d. Alors d doit être la valeur double la plus proche de x; ou si deux valeurs doubles sont également proches de x, alors d doit être l'une d'elles et le bit le moins significatif du d doit être 0.
Est-ce suffisant? Sinon, vous pouvez aussi rechercher la mise en œuvre ...
Cet article de Guy Steele fournit des détails sur la façon de procéder correctement. C'est beaucoup plus subtil que vous ne le pensez.
- 1. Comment convertir une chaîne (contenant double max) en double
- 2. Comment convertir une chaîne en double avec un cultureinfo approprié
- 3. Convertir la chaîne en double
- 4. cacao - convertir un double en chaîne
- 5. convertir très petit double en une chaîne
- 6. Convertir une chaîne en double - Java
- 7. convertir la chaîne en double
- 8. Comment convertir un double en chaîne en C++?
- 9. Comment convertir une chaîne en double en jaspe?
- 10. Convertir un double en une chaîne compatible SQL sur Android?
- 11. Comment convertir une chaîne de pourcentage en double?
- 12. Convertir la chaîne en double - VB
- 13. Convertir le double en chaîne avec une largeur fixe
- 14. Comment convertir une chaîne en un point?
- 15. Comment convertir une chaîne en un android.net.Uri
- 16. Comment convertir un HTMLElement en une chaîne
- 17. Comment convertir un objet en double?
- 18. Comment convertir un double en une chaîne en C++ (sans notation scientifique)?
- 19. Comment convertir un double en hexadécimal?
- 20. Comment convertir une chaîne en TimeSeriesDataItem
- 21. Comment convertir un doublon non géré en une chaîne managée?
- 22. comment convertir une chaîne utf8 en chaîne ASCII?
- 23. Comment convertir une chaîne C++ en un caractère *?
- 24. Comment convertir cette chaîne SQL en une chaîne ibatis sql?
- 25. convertir une chaîne hexadécimale en un NSData
- 26. convertir une chaîne en un fichier xml?
- 27. comment convertir une double valeur zéro de base de données en une chaîne vide?
- 28. Comment convertir un objet en une chaîne personnalisée en javascript?
- 29. Convertir une chaîne de nombres en NSTimeInterval
- 30. Convertir un double à une chaîne en Java et vice-versa sans perdre la précision
Il se fait différemment dans chaque langue, je dirais donc qu'il est très _dependent_ de langue, pas agnostique. – Oded