我相信,小数点后17位应该足以正确表示一个8字节的浮点数,以便它是往返安全的(转换为字符串,并且没有任何丢失)。浮点到字符串往返测试
但是在这个测试中,数字可以高达23,如果增加迭代次数可能会更高。
这是一个有缺陷的测试,为什么?
你如何确保在Python中float的往返完整性?
def TestLoop():
sFormat = ''
success = True
ff = [1.0/i for i in range(1,10000000)]
for n in range(17, 31):
sFormat = '{{:.{:d}f}}'.format(n)
success = True
for f in ff:
if f != float(sFormat.format(f)):
success = False
break
if success:
return(n)
return(-1)
n = TestLoop()
print('Lossless with ', n, ' decimal places.')
是的,使用'.17g'作为格式是正确的方法。 '.16e'也可以。不要在Python 2上使用'str':它没有提供足够的数字。但'repr'呢。 (在Python 3的最新版本中,'str'和'repr'对于浮点数是相同的。) –