Python 如何将浮点数存储为文本而不丢失精度?

Python 如何将浮点数存储为文本而不丢失精度?,python,floating-point,Python,Floating Point,正如问题所说。转换为(截断的)字符串表示形式或从中转换可能会影响其精度。但以其他格式(如pickle)存储它们会使它们无法读取(是的,我也想要这个) 如何在文本中存储浮点数而不丢失精度?pickle.dumps可以做到这一点,但我相信float(str(floatval))==floatval也可以——至少在同一个系统上…以二进制或其幂形式存储它 >>> (3.4).hex() '0x1.b333333333333p+1' >>> float.fromhex

正如问题所说。转换为(截断的)字符串表示形式或从中转换可能会影响其精度。但以其他格式(如pickle)存储它们会使它们无法读取(是的,我也想要这个)


如何在文本中存储浮点数而不丢失精度?

pickle.dumps
可以做到这一点,但我相信
float(str(floatval))==floatval
也可以——至少在同一个系统上…

以二进制或其幂形式存储它

>>> (3.4).hex()
'0x1.b333333333333p+1'

>>> float.fromhex('0x1.b333333333333p+1')
3.4

我建议使用内置函数
repr()
。从文件中:

repr(对象)->字符串

返回对象的规范字符串表示形式。 对于大多数对象类型,eval(repr(object))==object


您是否测试了字符串转换以确保转换对您来说是个问题?您希望的精度是多少?为了在不丢失信息的情况下保持可读性,
repr
是迄今为止您最好的选择。语言保证
float(repr(x))
在不丢失信息的情况下恢复
x
。@MarkDickinson,请也给我一个引用,因为有相反的答案。我使用的是Python2.7本身。虽然它不是最好的参考,但在本教程的浮点章节中提到过:重要的是,如果结果等于起始值,那么可以这样想,比如
check=lambda:float.fromhex(a.hex())==a
,并用它测试几个值。但总的来说,您的方法是非常好的。@glglgl:对于每个非无限、非NaN IEEE 754双精度浮点,该操作应该是完全幂等的。@IgnacioVazquez Abrams:对于无限也是如此!(和NaN,前提是您不关心可能丢失符号和/或有效负载位,或将信令NaN转换为安静的NaN。)这是典型的正确答案。值得注意的是,这种格式受到C标准库的支持(因此也受到许多其他语言的支持,因为它们倾向于利用它)<代码>浮点值并不总是在这个范围内。@Ignacio Vazquez Abrams,出于好奇,你能举个例子吗?不幸的是,我没有想到。@Ignacio Vazquez Abrams:在Python2.7和Python>=3.1中,
eval(repr(x))==x对所有有限浮点值都很好。更一般地说,
float(repr(x))
将为任何float
x
恢复
x
,包括无限和nan。如果有反例,它们就是bug,应该这样报告;关于Python