Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将excel数据读入数据框,精确到小数点后20位_Python_Pandas_Numpy_Floating Point_Precision - Fatal编程技术网

Python 将excel数据读入数据框,精确到小数点后20位

Python 将excel数据读入数据框,精确到小数点后20位,python,pandas,numpy,floating-point,precision,Python,Pandas,Numpy,Floating Point,Precision,我正在尝试使用pandas.ExcelFile()将excel中的数据读取到数据框中,然后使用to_csv输出文本文件 此输出文本文件的精度应为20位小数,并四舍五入到20位小数 如果excel中的输入值为.005,我的代码会将其转换为0.0050000000000000001,这是不正确的,因为最后一个数字。它应该是0.0050000000000000000 这是我的密码: dataFrame = pd.ExcelFile("xlFile.xlsx") pd.set_option("displ

我正在尝试使用pandas.ExcelFile()将excel中的数据读取到数据框中,然后使用to_csv输出文本文件

此输出文本文件的精度应为20位小数,并四舍五入到20位小数

如果excel中的输入值为.005,我的代码会将其转换为0.0050000000000000001,这是不正确的,因为最后一个数字。它应该是0.0050000000000000000

这是我的密码:

dataFrame = pd.ExcelFile("xlFile.xlsx")
pd.set_option("display.precision", 20)
dataFrame.ColumnToRound = dataFrame.ColumnToRound.round(20)
dataFrame.to_csv("out.txt", index=False, sep='\t', float_format='%.20f')
输入的excel文件如下所示(为了简单起见,只有一列和一个值):

圆柱绕

.005

在使用pandas.ExcelFile()读取excel文件时,我尝试过使用kwarg float_precision='round_trip',但没有任何区别


旁注:是的,我知道小数点后20位非常多,而且可能比必要的多,但这不是我的决定。它必须是20位小数。

实际上,0.0050000000001是数字的有效表示形式。Excel仅保证精度达到15位有效数字(根据标准)

这意味着,之后会发生什么是任何人的猜测(和选择)。在内部,Excel将数字表示为双精度浮点(64位),实际为0.0050000000000000001040834085588608425664715468883514404296875,但在显示数字时采用了技巧,在15位有效数字后剪切数字,如果单元格的格式要求更多小数,则用零填充


因此,当在Excel中显示数字0.005,最多30位小数时,您将看到0.005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000对号码执行。

@sacul,请删除重复标记好吗?这些似乎都不能回答我的问题。他们只是解释“浮点数学对计算机来说很难”。好吧,我只是认为这可以解释发生了什么,但不可否认,这不是一个解决方案。