1

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

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

例如,Excel 文件有一个带有 value 的单元格-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

4 回答 4

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

于 2012-03-28T13:27:23.537 回答
2

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

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

xlrd 准确地检索该值。

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

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

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

于 2012-03-29T20:13:23.587 回答
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....0 更复杂,您可能必须从头开始编写格式化程序。

于 2012-03-27T21:37:11.833 回答
0

我在这里回答了代码链接(使用数字格式将数字转换为字符串,就像 Excel 一样): https ://stackoverflow.com/a/19661081/327725

于 2013-10-29T14:32:14.013 回答