Почему "%.10f" % Decimal(u) испускает строку с буквенным двоеточием?
При форматировании числа для печати 12-значные числа форматируются двоеточием сразу после точки. Почему это происходит? Это Python 2.7 в системе 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
Дальнейшая информация:
Это не каждый 12-значный номер:
>>> 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
Это не происходит с любыми другими номерами длины. Кроме того, я пробовал printf в bash и perl, но этого не произошло ни с одним из них.
Что здесь происходит?
По запросу, вот скриншот видео.
Более запрашиваемая информация:
>>> import locale
>>> locale.getdefaultlocale()
('en_US', 'ISO8859-1')
Результат user2357112 код вставки:
>>> 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
Pastibin Antti_Happa напечатал все числа правильно.
Использование формата r дает:
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'
Использование форматов e, f и g обеспечивает следующее:
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
У меня нет доступа для установки или обновления чего-либо на этом сервере. Я могу запросить обновленную версию, но запросы на изменение такого рода занимают достаточно много времени. Кроме того, другие программы зависят от этой установки, и потребуется много испытаний.
Мне сообщили, что будут установлены только пакеты, предоставленные IBM, и что последний пакет python 2.7, предоставленный IBM, - 2.7.12.
Я "исправил" проблему, выполнив
othervar = '{0:.10f}'.format(somevar).replace(':', '0')
это крайне небезопасно, я знаю, но... пожимает плечами
Argh! Я только что заметил ошибку "один на один"... 123456789012
форматируется как один меньше: 123456789011.:0000000000
... это странная ошибка
1 ответ
Хотя это и не "ответ", я могу дать вам свои результаты по чуть более новой версии, работающей в AIX.
Извините, что я не могу воспроизвести вашу проблему.
[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'