Je souhaite imprimer des nombres à virgule flottante, de sorte qu'ils sont toujours écrits sous forme décimale (par exemple, 12345000000000000000000.0
ou 0.000000000000012345
, pas en notation scientifique, mais je veux garder la 15.7 décimales de précision et rien de plus.
Il est bien connu que l' repr
d'un float
est écrit en notation scientifique si l'exposant est supérieure à 15 ans, ou de moins de -4:
>>> n = 0.000000054321654321
>>> n
5.4321654321e-08 # scientific notation
Si str
est utilisé, la chaîne résultante est de nouveau en notation scientifique:
>>> str(n)
'5.4321654321e-08'
Il a été suggéré que je peux utiliser format
avec f
de drapeau et d'une précision suffisante pour se débarrasser de la notation scientifique:
>>> format(0.00000005, '.20f')
'0.00000005000000000000'
Il fonctionne pour ce numéro, si elle a certains supplémentaire des zéros à la fin. Mais alors le même format échoue .1
, ce qui donne des chiffres au-delà de la machine réelle précision de flotteur:
>>> format(0.1, '.20f')
'0.10000000000000000555'
Et si mon nombre est 4.5678e-20
, à l'aide de .20f
serait encore perdre de la précision relative:
>>> format(4.5678e-20, '.20f')
'0.00000000000000000005'
Ainsi, ces approches ne correspond pas à mes exigences.
Cela conduit à la question: quelle est la méthode la plus simple et aussi performant l'impression d'arbitraire nombre à virgule flottante au format décimal, ayant les mêmes chiffres que dans repr(n)
(ou str(n)
sur Python 3), mais toujours en utilisant le format décimal, pas la notation scientifique.
C'est, une fonction ou une opération, par exemple, convertit la valeur float 0.00000005
string '0.00000005'
; 0.1
de '0.1'
; 420000000000000000.0
de '420000000000000000.0'
ou 420000000000000000
et les formats de la valeur float -4.5678e-5
en tant que '-0.000045678'
.
Après le prime de la période: Il semble qu'il y a au moins 2 approches viables, comme Karin démontré que l'utilisation de la manipulation de la chaîne, on peut réaliser d'importantes boost de vitesse par rapport à mon algorithme initial sur Python 2.
Ainsi,
- Si la performance est importante et Python 2 compatibilité est nécessaire; ou si l'
decimal
module ne peut pas être utilisé pour une raison quelconque, alors Karin de l'approche à l'aide de la manipulation de la chaîne est la façon de le faire. - Sur Python 3, ma un peu plus court code sera aussi plus rapide.
Depuis que je suis avant tout développement sur Python 3, j'accepte ma propre réponse, et récompense par Karin le bounty.