首页 > 解决方案 > 格式化功能垫不一致

问题描述

格式功能在 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'

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

标签: python

解决方案


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

确实有一些方法可以处理任意精度的十进制数。这就是十进制模块的用途:

>>> 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'

推荐阅读