我正在开发一个使用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
等。
答案 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