浮点问题以及如何克服它

时间:2019-04-09 09:43:07

标签: python python-2.7

我必须非常正确地计算出不同点之间的高程。这意味着它们应尽可能正确。可悲的是,我用浮点数完成了完整的脚本。现在,在最终的高程计算中,我得到了错误的高度信息。我已经阅读了很多有关浮动问题的内容,但可悲的是,我找不到任何解决方法。有人说我应该将我的浮点数四舍五入然后再使用它,还有一些人说我应该使用十进制。遗憾的是,实际上并没有一个来源可以找到最适合我的问题的最佳解决方案。

我的海拔值(变量ListOfValues)是:

195,1850 
195,1550 
195,1625 
195,1400 
195,1350 
195,0925 
195,1050 
195,0800 
195,0825 
195,0625 
195,0650 
195,0350 
195,0425

这是我的代码:

for i in range(0, len(ListOfValues)-1):
        Elevation = Elevation + abs(ListOfValues[i] - ListOfValues[i+1])
    for i in range(0, len(ListOfValues)-2):
        if ListOfValues[i]<ListOfValues[i+1]:
            ElevationUpwards=ElevationUpwards+(ListOfValues[i+1] - ListOfValues[i])

        if ListOfValues[i]>ListOfValues[i+1]:
            ElevationDownwards=ElevationDownwards+(ListOfValues[i] - ListOfValues[i+1])

我没有通过0,0325来获取0.024999999999977263的向上仰角值。差异对我来说太大了。 在下面找到Python的计算:

195.185-195.155=0.030000000000001137
195.1625-195.155=0.007499999999993179
195.1625-195.14=0.052500000000009095
195.14-195.135=0.05750000000000455
195.135-195.0925=0.09999999999999432
195.105-195.0925=0.01999999999998181
195.105-195.08=0.12499999999997158
195.0825-195.08=0.022499999999979536
195.0825-195.0625=0.1449999999999818
195.065-195.0625=0.024999999999977263
195.065-195.035=0.17499999999998295

您建议什么来尽可能接近“真实”海拔值?


编辑: 虽然建议使用十进制方式,但我尝试了这种方式。我的代码现在是:

Elevation=Decimal(0.0)
ElevationUpwards=Decimal(0.0)
ElevationDownwards=Decimal(0.0)
for i in range(0, len(ListOfValues)-1):
        Elevation = Elevation + abs(Decimal(ListOfValues[i]) - Decimal(ListOfValues[i+1]))
for i in range(0, len(ListOfValues)-1):
        if ListOfValues[i]<ListOfValues[i+1]:
            ElevationUpwards=ElevationUpwards+(Decimal(ListOfValues[i+1]) - Decimal(ListOfValues[i]))

        if ListOfValues[i]>ListOfValues[i+1]:
            ElevationDownwards=ElevationDownwards+(Decimal(ListOfValues[i]) - Decimal(ListOfValues[i+1]))

现在,此代码的结果再次为:0.03249999999997044142219237984 我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

这是您要编写的代码。

如果您可以首先发布此代码,那就太好了。

ListOfValues = [195.1850,
195.1550,
195.1625,
195.1400,
195.1350,
195.0925,
195.1050,
195.0800,
195.0825,
195.0625,
195.0650,
195.0350,
195.0425]

Elevation = 0             # Elevation is not used after the loops
ElevationUpwards = 0
ElevationDownwards = 0    # ElevationDownwards is not used after the loops

for i in range(0, len(ListOfValues)-1):
    Elevation = Elevation + abs(ListOfValues[i] - ListOfValues[i+1])

for i in range(0, len(ListOfValues)-1):  # Changed this to -1 instead of -2 as posted
    if ListOfValues[i]<ListOfValues[i+1]:
        ElevationUpwards=ElevationUpwards+(ListOfValues[i+1] - ListOfValues[i])

    if ListOfValues[i]>ListOfValues[i+1]:
        ElevationDownwards=ElevationDownwards+(ListOfValues[i] - ListOfValues[i+1])

print(ElevationUpwards)

输出:

0.03249999999997044

这似乎是您正在寻找的价值。

您编写的代码具有正确的缩进形式,但是产生了错误的0.0245值。

更新

您始终可以在计算之前修正您的值,然后在之后更正结果:

ListOfValues=[int(v*10000) for v in ListOfValues]
# Then do the calculations
print(ElevationUpwards/10000)

输出:

0.0325