SpreadsheetML:应用程序如何parsing浮点数字?

我很难理解Excel处理单元值的方法,这些值在IEEE 754浮点上不能完全表示。

我的激励示例可以通过在Excel表格1的单元格A1中以单一数字以xlsx格式保存Excel 2010或2013的电子表格来实现。

然后,编辑底层XML,并将该单元格的值replace为如下所示:

<v>62408.000000000007</v> 

该数字有17位有效数字,并且不能完全用IEEE 754浮点表示。

在Java和Python中将string“62408.000000000007”parsing为双精度浮点数62408.00000000001,其中有一位数字较less,可以精确表示。 这两种编程语言都声称实现了IEEE 754的一个子集。

但是,随该文件一起提供的Excel 2010和2013在UI中显示62408(无论您在数字格式中指定了多less小数位,小数点后面只显示零)。 所以Excel似乎完全parsing了这个单元格值为62408。

任何人都可以指出我应该如何从一个单元格内的SpreadsheetML(xlsx)文件的v元素parsing一个浮点数的确定性参考?

什么也将是有用的是一个明确的参考如何Excel做到这一点。

我试图在http://www.ecma-international.org/publications/standards/Ecma-376.htm上检查Office Open XML标准参考文档

然而,除了发现v元素在这个上下文中有ST_Xstringtypes之外,我无法find任何有关如何parsing单元格值的东西,特别是作为数字。

任何人都可以指出我应该如何从SpreadsheetML(xlsx)文件的v元素中的单元格中parsing浮点数的确定性参考。

我怀疑是否有一个,但我可以分享我的一些经验,编写用四种不同的编程语言编写xls和xlsx文件的库。

Excel使用标准的IEEE 754浮点。 在编写xlsx文件时,需要将这些值编码为一个string,并且15位以外的数字的任何变化可能都是由于printf样式格式所致。

它可能显示62408.000000000007为62408,但在内部它仍然处理它作为一个IEEE 754双。 这在xls格式中更为明显,其中值保存为64位IEEE 754双精度内存。

所以要回答“如何应用程序应该parsing一个浮点数”的一部分你的问题; 应用程序应该使用任何可用的库来parsing它们,以将double的string表示forms转换为内存中的doubleforms。 如果您的应用程序使用与Excel相同的编译器进行编译,那么您可能会通过相同的系统库获得完全相同的结果。 如果不是,你可能会得到相同的结果。

但是,这并不能保证数字在双倍的时候会显示为整数。 这是Excel应用程序正在做的事情,与文件格式无关。

所以Excel似乎完全parsing了这个单元格值为62408。

我认为这似乎是完全正确的,你所看到的是由于表示层。 我怀疑Excel是否可以精确地parsing一个值,如果它不能完全代表IEE754格式。