Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Convertir un très grand nombre en chaîne de caractères

+2 votes

J'ai un nombre aléatoire qui est toujours très grand, stocké sous forme de Decimal. Si grand que quand je veux l'utiliser en tant que chaîne de caractères, Python me le transforme en notation scientifique (comme 2.982674749203805353417802267E+116).

Or j'ai besoin de récupérer le nombre exact contenu dans ce Decimal sous forme de chaîne de caractères.

demandé 15-Fev-2015 par Epoc (392 points)
reclassée 15-Fev-2015 par Epoc

2 Réponses

+8 votes
 
Meilleure réponse

Afin que python te retourne une chaîne de caractère tu dois formatter tes valeurs flottantes explicitement:

print 2.982674749203805353417802267E+116
>>> 2.9826747492e+116

print format(2.982674749203805353417802267E+116, '.0f')
>>> 298267474920380529220818780317279020350806884688820330641806081122482081542048008779680269400944168780203563524554752

print format(2.982674749203805353417802267E+116, 'f')
>>> 298267474920380529220818780317279020350806884688820330641806081122482081542048008779680269400944168780203563524554752.000000

Le première exemple est de type 'float', les 2 suivants sont de type 'str'.

répondu 15-Fev-2015 par barnumbirr (2,750 points)
sélectionné 15-Fev-2015 par Epoc

Pense à préciser que tu es en python 2.7 au cas où l'auteur du poste est en python3.4, en effet il faudrait des parenthèses au print sinon ça risque d'afficher un message d'erreur si jamais il exécute en python3.
Ce n'est qu'un détail mais vu que je ne connais pas le niveau de l'auteur de la question, on sait jamais =)'. (au pire ça filera à un tuyau à quelqu'un d'autre).

J'en profite pour rappeler qu'il faut essayer le max possible de donner plus d'infos, notamment sur la version de python utilisée...car le code source peut ne pas être compatible.

Fin de la parenthèse...( =D )

(Niveau noob mais oui c'est du Python 3.4, j'ai su comment faire en sorte que ça fonctionne :D)

Merci à toi !

+5 votes

J'ai l'impression que tu utilises le module Decimal de python ?

Donc pour avoir des chiffres significatifs en plus, il faut que tu règles la précision du contexte. La doc est là: https://docs.python.org/3/library/decimal.html#decimal.Context

Mais un petit exemple est toujours plus parlant:

from decimal import Decimal, getcontext
# precision avec seulement 23 digits:
getcontext().prec = 23
d = Decimal(Decimal(2) ** Decimal(2048))
# str(d) donne '3.2317006071311007300715E+616'
getcontext().prec = 700
d = Decimal(Decimal(2) ** Decimal(2048))
# str(d) donne '32317006071311007300714876688669951960444102669715484032130345427524655138867890893197201411522913463688717960921898019494119559150490921095088152386448283120630877367300996091750197750389652106796057638384067568276792218642619756161838094338476170470581645852036305042887575891541065808607552399123930385521914333389668342420684974786564569494856176035326322058077805659331026192708460314150258592864177116725943603718461857357598351152301645904403697613233287231227125684710820209725157101726931323469678542580656697935045997268352998638215525166389437335543602135433229604645318478604952148193555853611059596230656'
répondu 15-Fev-2015 par bulange (618 points)

Merci à toi aussi, effectivement je cherchais également à augmenter la précision

...