如何将浮点数以文本形式存储而不失去精度?

7

正如问题所述,将浮点数转换为/从(截断的)字符串表示形式可能会影响其精度。但是将它们存储在pickle等其他格式中会使它们变得不可读(是的,我也想要这个)。

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


你测试过字符串转换,确保转换不会成为问题吗? - Greg Hewgill
你需要什么精度? - Burhan Khalid
好吧,这不是最好的参考资料,但它在教程的浮点数章节中提到:http://docs.python.org/release/3.1.5/tutorial/floatingpoint.html - Mark Dickinson
这也在更改Python 3(以及Python 2.7之后)的浮点表示提案中得到了广泛讨论:http://bugs.python.org/issue1580 - Mark Dickinson
太好了...请将所有这些内容添加到答案中,它值得成为答案 - Jesvin Jose
显示剩余2条评论
3个回答

8

将其存储为二进制或其幂。

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

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

重要的是,如果结果与起始值相等,那么类似于check = lambda a: float.fromhex(a.hex()) == a这样的东西,并使用它来测试几个值。但总的来说,您的方法非常好。 - glglgl
@glglgl:对于每个非无穷大、非NaN的IEEE 754双精度浮点数,该操作应该是完全幂等的。 - Ignacio Vazquez-Abrams
@IgnacioVazquez-Abrams:而且还适用于无限大!(如果您不介意可能会失去符号和/或有效载荷位,或将信号NaN转换为静默NaN,则也适用于NaN。) - Mark Dickinson
这是规范的正确答案。值得注意的是,这种格式由C标准库支持(因此许多其他语言也支持它,因为它们倾向于利用它)。 - Stephen Canon

3
我建议使用内置函数repr()。从文档中可以了解到:

repr(object) -> string

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


2
问题在于“最大值”。float并不总是符合该要求。 - Ignacio Vazquez-Abrams
1
@Ignacio Vazquez-Abrams,出于好奇,您能给出一些例子吗? - silvado
很抱歉,我暂时想不起来。 - Ignacio Vazquez-Abrams
1
@Ignacio Vazquez-Abrams:在Python 2.7和Python>=3.1中,eval(repr(x)) == x 对于所有有限浮点数都可以正常工作。更一般地说,float(repr(x))将恢复任何浮点数x,包括无穷大和NaN。如果存在反例,则它们是错误,应该报告为此类错误。 - Mark Dickinson

-1

pickle.dumps 可以实现,但我相信 float(str(floatval)) == floatval 也可以 -- 至少在同一系统上...


不可以在 Python <= 2.7 和 Python 3.1 中使用 float 的 str(),因为它会丢失精度(尽管在 Python 3.2 及更高版本中不会)。你应该使用 repr - Mark Dickinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接