正如问题所述,将浮点数转换为/从(截断的)字符串表示形式可能会影响其精度。但是将它们存储在pickle等其他格式中会使它们变得不可读(是的,我也想要这个)。
我该如何在文本中存储浮点数而不失去精度?
正如问题所述,将浮点数转换为/从(截断的)字符串表示形式可能会影响其精度。但是将它们存储在pickle等其他格式中会使它们变得不可读(是的,我也想要这个)。
我该如何在文本中存储浮点数而不失去精度?
将其存储为二进制或其幂。
>>> (3.4).hex()
'0x1.b333333333333p+1'
>>> float.fromhex('0x1.b333333333333p+1')
3.4
check = lambda a: float.fromhex(a.hex()) == a
这样的东西,并使用它来测试几个值。但总的来说,您的方法非常好。 - glglglrepr()
。从文档中可以了解到:
repr(object) -> string
返回对象的规范字符串表示形式。 对于大多数对象类型,eval(repr(object)) == object。
float
并不总是符合该要求。 - Ignacio Vazquez-Abramseval(repr(x)) == x
对于所有有限浮点数都可以正常工作。更一般地说,float(repr(x))
将恢复任何浮点数x
,包括无穷大和NaN。如果存在反例,则它们是错误,应该报告为此类错误。 - Mark Dickinsonpickle.dumps
可以实现,但我相信 float(str(floatval)) == floatval
也可以 -- 至少在同一系统上...
str()
,因为它会丢失精度(尽管在 Python 3.2 及更高版本中不会)。你应该使用 repr
。 - Mark Dickinson