Python 浮点问题及其克服方法

Python 浮点问题及其克服方法,python,python-2.7,Python,Python 2.7,我必须非常正确地计算不同点之间的高程。这意味着它们应该尽可能正确。遗憾的是,我已经用浮点数完成了我的完整脚本。现在在最后的高程计算中,我得到了错误的高度信息。我已经读了很多关于浮动问题的书,但遗憾的是我找不到任何方法来克服它。有人说我应该把浮点数四舍五入,然后玩它,还有人说应该使用十进制。可悲的是,我真的找不到最适合我的问题的最佳解决方案 我的高程值变量列表值为: 195,1850 195,1550 195,1625 195,1400 195,1350 195,0925 195,10

我必须非常正确地计算不同点之间的高程。这意味着它们应该尽可能正确。遗憾的是,我已经用浮点数完成了我的完整脚本。现在在最后的高程计算中,我得到了错误的高度信息。我已经读了很多关于浮动问题的书,但遗憾的是我找不到任何方法来克服它。有人说我应该把浮点数四舍五入,然后玩它,还有人说应该使用十进制。可悲的是,我真的找不到最适合我的问题的最佳解决方案

我的高程值变量列表值为:

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])
您建议如何尽可能接近实际高程值

编辑: 虽然有人建议使用十进制方法,但我尝试了这个方法。我的代码是:

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.0324999999970444142219237984
我做错什么了吗?

这就是你要写的代码

如果你能在第一时间发布这段代码,那就太好了

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.0245值

更新:

您始终可以在计算前确定值,然后更正结果:

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

0.03249999999997044
0.0325

停止使用浮动?也有类似于和的替代方法。仅仅对数量级差异很小的数字进行一系列的加法/减法运算之后,就产生了如此大的误差,这不是由浮点的舍入问题造成的。检查你的算法。我在第一篇文章中添加了上面的计算。我的回答显示,在使用小数的更新中,你仍然使用lenListOfValues-2而不是lenListOfValues-1。对不起,我忘了复制正确的代码,但我现在修复了它。但我仍然得到近似值,而不是实际值。
0.0325