【问题标题】:How to store a floating point number as text without losing precision?如何在不丢失精度的情况下将浮点数存储为文本?
【发布时间】:2012-06-20 06:13:12
【问题描述】:

就像问题所说的那样。转换为/从(截断的)字符串表示形式可能会影响其精度。但是将它们存储为其他格式(例如 pickle)会使它们不可读(是的,我也想要这个)。

如何在不丢失精度的情况下将浮点数存储在文本中?

【问题讨论】:

  • 您是否测试过字符串转换以确保转换对您来说是个问题?
  • 您在寻找什么精度?
  • 为了在不丢失信息的情况下保持可读性,repr 是迄今为止您最好的选择。语言保证float(repr(x)) 恢复x 而不会丢失信息。
  • @MarkDickinson,也请给我一个引用,因为有相反的答案。我正在使用 Python 2.7 本身。
  • 嗯,这不是最好的参考,但在教程的浮点章节中提到了:docs.python.org/release/3.1.5/tutorial/floatingpoint.html

标签: python floating-point


【解决方案1】:

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

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

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

【讨论】:

  • 重要的是如果这个结果等于开始,所以像check = lambda a: float.fromhex(a.hex()) == a 这样,测试几个值。但总的来说,您的方法非常好。
  • @glglgl:对于每个非无限、非 NaN IEEE 754 双精度浮点数,该操作应该是完全幂等的。
  • @IgnacioVazquez-Abrams:还有无穷大! (还有 NaN,前提是您不关心可能丢失符号和/或有效负载位,或者将信号 NaN 变成安静的 NaN。)
  • 这是规范的正确答案。值得注意的是,C 标准库支持这种格式(因此许多其他语言都支持这种格式,因为它们倾向于利用它)。
【解决方案2】:

我建议使用内置函数repr()。来自文档:

repr(object) -> 字符串

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

【讨论】:

  • 问题是“最”的。 float 并不总是属于这个范围。
  • @Ignacio Vazquez-Abrams,出于好奇,你能举个例子吗?
  • 不幸的是,我没有想到。
  • @Ignacio Vazquez-Abrams:在 Python 2.7 和 Python >= 3.1 中,eval(repr(x)) == x 适用于所有有限浮点数。更一般地说,float(repr(x)) 将恢复 x 对于任何浮点数 x,包括无穷大和 nans。如果有反例,它们就是错误,应该这样报告。
【解决方案3】:

pickle.dumps 会这样做,但我也相信float(str(floatval)) == floatval —— 至少在同一个系统上......

【讨论】:

  • 否;在 Python str() 的浮点数将失去精度(尽管对于 Python 3.2 及更高版本,它不会)。您想改用repr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2018-01-15
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多