gpt4 book ai didi

python - python 为什么以及如何截断数值数据?

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:25 26 4
gpt4 key购买 nike

我在这里处理两个变量,但很困惑,因为当我想按原样将它们作为 URL 参数发送时,它们的值似乎在变化(它们失去了精度)。

看看这个场景,因为我在此处从 python 解释器重现了它:

>>> lat = 0.33245794180134
>>> long = 32.57355093956
>>> lat
0.33245794180133997
>>> long
32.57355093956
>>> nl = str(lat)
>>> nl '0.332457941801'
>>> nlo = str(long)
>>> nlo '32.5735509396'

那么发生了什么?以及如何确保当我将 latlong 序列化为字符串并将它们作为 url 查询字符串的一部分发送时,我不会失去它们的精确精度?

澄清情况:

  1. 数据最初作为 float (在集合中)来自另一个模块,该模块通过计算创建它们。
  2. 精度在这里是一个敏感问题,因为此数据用于跟踪和监控分类,错误的值可能会导致误报或不必要的警报。
  3. 如果不将数据序列化为字符串(因此我可以将它们作为参数放置在查询字符串中),就无法将数据发送到目标引擎(通过 RESTIFUL API 进行监听)

所以我需要的是将 float 转换为字符串的最佳方法,同时将精度/信息损失降至最低。

最佳答案

一般来说,如果您使用 '%.14f' % lat,您将失去精度

要从 float 获得完整的精度,请使用 repr()

例子:

>>> lat = 1/3.
>>> lat
0.3333333333333333
>>> str(lat).count('3')
12
>>> ('%.14f' % lat).count('3')
14
>>> repr(lat).count('3')
16
>>>

顺便说一下,您使用的是旧 Python。

>>> 0.33245794180134 == 0.33245794180133997
True
>>>

2.7 之前的 Python 使用 17 位有效的十进制数字生成 repr(a_float),因为这将保证 float(repr(a_float)) == a_float。新方法是使用将提供相同保证的最少位数。关注this link和 Ctrl-F 搜索 repr()

如果您从外部来源获取这些数字,那么您可能会通过 float 它们然后使用 14 位十进制数字的精度序列化它们来失去精度。

如果您通过计算获得这些数字,那么您可能会因为使用 14 位十进制数字的精度对它们进行序列化而失去精度。

总结:一般来说,如果你使用 '%.14f' % lat,正在失去精度——不是 Python,不是浮点运算,是你......

关于python - python 为什么以及如何截断数值数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5728978/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com