格式化功能垫不一致

时间:2018-04-24 11:18:33

标签: python

16点精度后,格式化功能无法正常工作

>>> '{0:.17}'.format(0.10555584)
'0.10555584'
>>> '{0:.17}'.format(0.10555584124567896)
'0.10555584124567896'
>>> '{0:.26}'.format(0.10555584124567896)
'0.10555584124567896076030138'
>>> '{0:.18}'.format(0.10555584124567896)
'0.105555841245678961'
>>> '{0:.18}'.format(0.10555584124567896)
'0.105555841245678961'
>>> '{0:.18}'.format(0.10555584124567)
'0.105555841245669996'
>>> '{0:.18}'.format(0.10)
'0.100000000000000006'
>>> '{0:.17}'.format(0.10)
'0.10000000000000001'
>>> '{0:.16}'.format(0.10)
'0.1'
>>> '{0:.15}'.format(0.10)
'0.1'
>>> '{0:.17}'.format(0.12345678901234567)
'0.12345678901234566'
>>> '{0:.17}'.format(0.1234567890123456)
'0.12345678901234559'
>>> '{0:.17}'.format(0.123456789012345678)
'0.12345678901234568'
>>> '{0:.17}'.format(0.12345678901234567)
'0.12345678901234566'

是否有任何解决方法或其他方式以更高的精度工作。

1 个答案:

答案 0 :(得分:1)

这不是格式问题,而是浮点数表示的问题。所有当前计算机都使用IEEE 754,双精度(64位)float的精度约为16位。

确实有办法处理任意精度的十进制数。这就是decimal模块的用途:

>>> import decimal
>>> d = decimal.Decimal('0.12345678901234567890123456789')
>>> d
Decimal('0.12345678901234567890123456789')
>>> '{0:.17}'.format(d)
'0.12345678901234568'
>>> '{0:.26}'.format(d)
'0.12345678901234567890123457'
>>> str(d)
'0.12345678901234567890123456789'