使用xlrd从xls获取浮点数

我正在开发一个Python脚本,它使用xlrd从xls文件中获取数据。 但是,我不知道如何打印与Excel文件中具有相同精度的浮点数。

我尝试使用repr按照https://stackoverflow.com/a/3481575/1296490build议,但这仍然给不同的精度,从我想要的。

例如,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等。

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.15"

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

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

xlrd完全检索该值。

Python的repr以可检索的方式提供该值的确切string表示forms… float(repr(value)) == value绝对有保证。

使用str(value)失去精度。

使用decimal.Decimal与超过17个十进制数字是毫无意义的。

从单独的浮点数值来看,Python(或任何其他程序)无法确定所需的显示精度,因此首先必须找出要显示的地点数量,例如,通过parsingexcel数字格式string(可能为'0.00000' – > 5小数点后)

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

一旦确定了要显示的位置数量,可以使用两个参数forms的string格式

 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 …. 0更复杂,你可能必须从头开始编写格式化程序。

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