web-dev-qa-db-ja.com

"%.10f"%Decimal(u)がリテラルコロンを含む文字列を出力できるのはなぜですか?

印刷する数値をフォーマットする場合、12桁の数値はドットの直後にコロンを付けてフォーマットされます。なぜこうなった?これは、AIXシステムのPython 2.7です。

$ 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

これは、他の長さの数値では発生しません。また、私はbashとPerlのprintfを試しましたが、これはどちらでも起こりません。

ここで何が起きてるの?

リクエストに応じて、ここに スクリーンショットビデオ を示します。

より多くの要求された情報:

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

User2357112 Pastebinコードの結果:

>>> 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のPastebinはすべての数値を正しく印刷しました。

フォーマット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提供のパッケージのみがインストールされ、IBMが提供する最新のpython 2.7パッケージは2.7.12です。

私は行うことによって問題を「修正」しました

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

これは非常に安全ではないことは知っていますが、...shrug

ああ! 1つずれたエラーに気づきました... 123456789012は1つ少なくフォーマットされています:123456789011.:0000000000 ...これは奇妙なバグです。

40
harleypig

「答え」ではありませんが、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'
1
Dee Holtsclaw