使用xlrd从xls获取浮点数

时间:2012-03-27 20:40:58

标签: python excel floating-point xlrd

我正在开发一个使用xlrd从xls文件获取数据的Python脚本。但是,我无法弄清楚如何以与Excel文件中相同的精度打印浮点数。

我尝试使用https://stackoverflow.com/a/3481575/1296490中建议的repr,但这仍然与我想要的精度不同。

例如,Excel文件的单元格值为-1.62717010683527,然后使用
str(worksheet.cell(i,j).value)返回-1.62717010684
repr( worksheet.cell(i,j).value)返回-1.6271701068352695  使用str(Decimal(worksheet.cell(i,j).value))生成-1.6271701068352695095187044671547482721507549285888671875

上述所有内容均未向我提供Excel的原始值。我必须处理许多这样的数字,每个数字在点后面都有不同的位数,不适合使用%.10f等。

4 个答案:

答案 0 :(得分:4)

Excel中的精度仅限于15位有效数字。

使用str( "%0.15g" % cell.value )达到您想要的效果:

g - Same as "e" if exponent is greater than -4 or less than precision, "f" otherwise.
http://docs.python.org/release/2.4.4/lib/typesseq-strings.html

不要忘记0.中的"%0.15"

答案 1 :(得分:2)

Excel在其计算中使用IEEE标准64位浮点。然而,它试图假装它使用15位十进制数字的十进制浮点数。

“excel的原始价值”是一个非常模糊的概念。您似乎想要Excel显示给您。这是 NOT 它放在文件中的内容。它放在文件中的是IEEE标准的64位二进制浮点值。

xlrd完全检索该值。

Python的repr以可检索的方式提供该值的精确字符串表示... float(repr(value)) == value绝对有保证。

使用str(value)会失去精确度。

使用带有超过17个有效十进制数字的decimal.Decimal是没有意义的。

答案 2 :(得分:0)

仅从浮点值Python(或任何其他程序)无法确定所需的显示精度,因此首先您必须找出要显示的位置数,例如通过解析excel数字格式字符串(可能是'0.00000' - > 5小数位)

获取数字格式的起点可能是 http://groups.google.com/group/python-excel/browse_thread/thread/2d07febfa031dfa5

确定要显示的地点数后,可以使用两种形式的字符串格式

value = -1.6271701068352695   # value stored ( not displayed ) in excel
precision = 5    # to be found out from excel number format
print '%.*f' % (precision, value)

不幸的是,格式化为任意Excel格式很难,因此如果格式化比0.0000 ....更复杂,您可能需要从头开始编写格式化程序。

答案 3 :(得分:0)

我已回答了代码的链接(使用数字格式将数字转换为字符串,如Excel所示): https://stackoverflow.com/a/19661081/327725