我使用Python读取文件并将写入字符串的数值转换为float。我观察到一个奇怪的转换:
a="-5.970471694E+02"
b = float(a)
b
>> -597.0471694
bb = np.float64(a)
bb
>> -597.04716940000003
e="-5.970471695E+02"
ee = np.float64(e)
ee
>> -597.0471695
ee-bb
>> -9.9999965641472954e-08
术语" 0000003"的原因是什么?在bb
结束时。为什么我不为ee
观察同样的事情。这真的是个问题吗?我认为这个问题是由浮点精度引起的,但在开始使用变量之前,结果似乎有些不适...
答案 0 :(得分:2)
bb
末尾的术语“0000003”是什么原因。为什么我对ee
没有注意到同样的事情。
b
和bb
具有相同的值(尝试评估b == bb
)。差异归结为解释器如何表示它们。默认情况下,numpy浮点数在小数位后面显示8位数,而Python浮点数打印到13位有效数字(包括小数位前的数字)。
这真的是个问题吗?
由于b
和bb
的实际值相同,因此答案几乎肯定是否定的。如果显示差异困扰您,您可以使用np.set_printoptions
来控制如何在解释器中表示numpy浮点数。如果您使用IPython,您还可以使用%precision
magic来控制常规Python浮动的打印方式。
答案 1 :(得分:-1)
float和float64都使用数字的二进制表示。两者都必须保存由基数为10的数字转换为基数为2的数字所引起的近似值。浮点数使用的位数较少,因此错误较大,并且在a
复制到b
时可见b
。这是因为a
使a
包含舍入错误而不会丢失信息,000..03
包含import fiona
from shapely.geometry import Point, shape
# Shape files (Small Lakes Europe, Lakes, Coast)
le_loc = ".../water-polygons-split-4326/ne_10m_lakes_europe.shp"
lw_loc = ".../water-polygons-split-4326/ne_10m_lakes.shp"
c_loc = ".../water-polygons-split-4326/water_polygons.shp"
print("Opening Shape-Files")
le_poly = [shape(pol['geometry']) for pol in fiona.open(le_loc)]
lw_poly = [shape(pol['geometry']) for pol in fiona.open(lw_loc)]
c_poly = [shape(pol['geometry']) for pol in fiona.open(c_loc)]
def point_in_water(lat, lon):
xy_point = Point(lon, lat)
for one in [c_poly, lw_poly, le_poly]:
for shape in one:
if shape.contains(xy_point):
return True
return False
# Test (true)
print(point_in_water(46.268408, 6.180437))
值。换句话说,将十进制数转换为二进制数是一个舍入误差。