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