python在十进制后自动添加数字

时间:2017-07-26 18:09:03

标签: python pandas csv dataframe floating-point

Python程序会自动在浮动经度中添加额外的数字。我正在创建新专栏" src"," des"在csv中使用其他人。可以在结果csv中看到第4行," des"包含与Dropoff_longitude中的经度值不同的经度值。但我希望它具有相同的价值。制作元组时不做任何修改。

代码:

import pandas as pd
import numpy as np

def loc(x):

    return (round(x[0],14),round(x[1],14))


columns=["Pickup_latitude","Pickup_longitude","Dropoff_latitude","Dropoff_longitude"]
df=pd.read_csv("demo.csv")
df["src"]=df[ ["Pickup_latitude","Pickup_longitude"] ].apply(loc,axis=1)
df["des"]=df[ ["Dropoff_latitude","Dropoff_longitude"] ].apply(loc,axis=1)
df.to_csv("result.csv",index=False)

我添加了result.csv

的图片

2 个答案:

答案 0 :(得分:1)

从我所知道的情况来看,-73.81632995609999是唯一关闭的数字,它的关闭幅度非常小。这是一个记录良好的问题,因为Python显示浮点数。来自python website

  

在运行Python的典型计算机上,Python浮点数有53位可用精度,因此输入十进制数0.1时内部存储的值是二进制小数   0.00011001100110011001100110011001100110011001100110011010接近但不完全等于1/10。

     

很容易忘记存储的值是原始小数的近似值,因为浮点数在解释器提示符处显示的方式。 Python仅将十进制近似值打印到机器存储的二进制近似值的真实十进制值。如果Python要打印存储为0.1的二进制近似值的真实十进制值,则必须显示

     

>>> 0.1 0.1000000000000000055511151231257827021181583404541015625

更具体地说是小型表示错误:

  

表示错误是指某些(大多数,实际上)小数部分不能完全表示为二进制(基数2)分数的事实。这是Python(或Perl,C,C ++,Java,Fortran和许多其他人)经常无法显示您期望的确切十进制数的主要原因:

     

>>> 0.1 + 0.2 0.30000000000000004

     

为什么? 1/10和2/10不能完全表示为二进制分数。今天(2010年7月)几乎所有机器都使用IEEE-754浮点运算,几乎所有平台都将Python浮点数映射到IEEE-754“双精度”。 754双精度包含53位精度,因此在输入时,计算机努力将0.1转换为J / 2 ** N形式的最接近的分数,其中J是一个包含正好53位的整数。

简而言之,这种修改是因为Python存储数字的方式。您可以尝试乘以10 ^ n并将这些值存储为整数,然后在需要它们进行计算时进行除法。如果您正在进行简单的计算,python创建的小差异不会对这些产生重大影响。希望这会有所帮助。

答案 1 :(得分:0)

这不是Python特有的;它是真实(浮点)数字准确性的问题。对于大多数分数,二进制内部表示并不精确;运行时系统为您提供了它可以管理的最接近的近似值。当写出该二进制数时,您将获得内部二进制文件的最佳十进制表示形式;转换为float时原始输入会丢失。

如果要准确保留原始文件中的数字,则需要在输出上执行必要的格式化(请参阅Python输出格式以获取帮助),或者将所有处理作为字符串进行,没有转换为浮动。

这会让你感动吗?