编程语言
首页 > 编程语言> > python为什么以及如何截断数值数据?

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

作者:互联网

我在这里处理两个变量,但是因为当我想将它们作为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'

那么发生了什么?我怎样才能确保当我将lat和long序列化为字符串并将它们作为url的查询字符串的一部分发送时,我不会失去它们的精确度?

澄清情况:

>数据最初作为浮动(在集合中)来自另一个从计算中创建它们的模块.
>精度是一个敏感的问题,因为这些数据用于跟踪和监控排序,错误的值可能会导致误报或不必要的警报.
>没有办法将数据发送到目标引擎(通过一个狡猾的api监听)而不将数据序列化为字符串(所以我可以将它们作为参数放在查询字符串中)

所以我需要的是将浮点数转换为字符串的最佳方法,其中精度/信息损失最小.

解决方法:

一般来说,如果你使用’%.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().

如果你从外部源获取这些数字,那么你可能会通过浮动它们然后用14个十进制数字的精度序列化它们来丢失精度.

如果您通过计算获得这些数字,那么您可能会通过将它们精确到14个十进制数字序列来丢失精度.

简介:一般来说,如果使用’%.14f’%lat,你就会失去精度 – 不是Python,不是浮点运算,而是你……

标签:python,serialization,floating-accuracy
来源: https://codeday.me/bug/20190723/1516346.html