从数值到字符串的转换(科学计数法)

时间:2016-01-04 10:23:24

标签: python numpy precision

我使用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观察同样的事情。这真的是个问题吗?我认为这个问题是由浮点精度引起的,但在开始使用变量之前,结果似乎有些不适...

2 个答案:

答案 0 :(得分:2)

  

bb末尾的术语“0000003”是什么原因。为什么我对ee没有注意到同样的事情。

bbb具有相同的值(尝试评估b == bb)。差异归结为解释器如何表示它们。默认情况下,numpy浮点数在小数位后面显示8位数,而Python浮点数打印到13位有效数字(包括小数位前的数字)。

  

这真的是个问题吗?

由于bbb的实际值相同,因此答案几乎肯定是否定的。如果显示差异困扰您,您可以使用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)) 值。换句话说,将十进制数转换为二进制数是一个舍入误差。