40 votes

Pourquoi "% .10f"% Decimal (u) peut-il émettre une chaîne avec un deux-points?

Lors du formatage d'un nombre à être imprimé, à 12 chiffres sont les numéros mis en forme avec un colon immédiatement après le point. Pourquoi est-ce arrivé? C'est Python 2.7 sur un système AIX.

$ uname -a ; /opt/bin/python2.7
AIX myserver 1 6 00F6A5CC4C00
Python 2.7.12 (default, Sep 29 2016, 12:02:17) [C] on aix5
Type "help", "copyright", "credits" or "license" for more information.
>>> '{0:.10f}'.format(123456789012)
'123456789011.:000000000'
>>> from decimal import Decimal
>>> u=123456789012
>>> print "%.10f" % Decimal(u)
123456789011.:000000000

Plus d'informations:

Ce n'est pas tous les 12 chiffres du numéro de téléphone:

>>> for x in range(123456789010,123456789020):
...     print '{0:.10f}'.format(x)
...
12345678900:.0000000000
123456789010.:000000000
123456789011.:000000000
123456789013.0000000000
123456789013.:000000000
123456789015.0000000000
123456789016.0000000000
123456789017.0000000000
123456789017.:000000000
123456789019.0000000000

Ce n'est pas le cas avec tout autre longueur des numéros. Aussi, j'ai essayé de bash et perl printf et ce n'est pas le cas avec l'un d'eux.

Ce qui se passe ici?

Comme demandé, voici une capture d'écran de la vidéo.

Plus d'informations demandées:

>>> import locale
>>> locale.getdefaultlocale()
('en_US', 'ISO8859-1')

Résultat de user2357112 pastebin code:

>>> import ctypes
>>> f=ctypes.pythonapi.PyOS_double_to_string
>>> f.argtypes=ctypes.c_double,ctypes.c_char,ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_int))
>>> f.restype=ctypes.c_char_p
>>> print f(123456789012.0, 'f', 10, 0, None)
123456789011.:000000000

Antti_Happa de pastebin imprimé tous les nombres correctement.

À l'aide de format r donne:

print 'e: {0:.10e}\nf: {0:.10f}\ng: {0:.10g}\nr: {0:0r}'.format(x)
ValueError: Unknown format code 'r' for object of type 'int'

À l'aide de e, f et g formats suivants:

for x in range(123456789000,123456789019):
print 'e: {0:.10e}\nf: {0:.10f}\ng: {0:.10g}'.format(x)
e: 1.2345678900e+11
f: 123456789000.0000000000
g: 1.23456789e+11
e: 1.2345678900e+11
f: 123456789000.:000000000
g: 1.23456789e+11
e: 1.2345678900e+11
f: 123456789001.:000000000
g: 1.23456789e+11
e: 1.2345678900e+11
f: 123456789003.0000000000
g: 1.23456789e+11

Je n'ai pas d'accès pour installer ou mettre à jour quoi que ce soit sur ce serveur. Je peux demander une version mise à jour, mais les demandes de changement de cette nature, prendre une bonne quantité de temps. En outre, d'autres programmes dépendent de cette installation, et un grand nombre de tests seraient nécessaires.

J'ai été informé que seul IBM fourni paquets seront installés et que la dernière version de python 2.7 package fourni par IBM est 2.7.12.

J'ai "résolu" le problème en fait

othervar = '{0:.10f}'.format(somevar).replace(':', '0')

ce qui est extrêmement dangereux, je le sais, mais ... haussement d'épaules

Argh! Je viens de remarquer une-par-une erreur ... 123456789012 est formaté comme un moins: 123456789011.:0000000000 ... c'est un bug bizarre.

1voto

Dee Holtsclaw Points 36

Bien que ce ne soit pas une "réponse", je peux vous donner mes résultats sur une version légèrement plus récente fonctionnant sous AIX.

Désolé de ne pas pouvoir reproduire votre problème.

 [lholtscl@ibm3 ~]$ python
Python 2.7.13 (default, Sep  7 2017, 21:08:50) [C] on aix7
Type "help", "copyright", "credits" or "license" for more information.
>>> print "%.10f" % 123456789012
123456789012.0000000000
>>> '{0:.10f}'.format(123456789012)
'123456789012.0000000000'
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X