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'
是否有任何解决方法或其他方式以更高的精度工作。
答案 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'