【问题标题】:SpreadsheetML: How should consuming applications parse floating-point numbers?SpreadsheetML:消费应用程序应该如何解析浮点数?
【发布时间】:2014-06-03 10:12:47
【问题描述】:

我在理解 Excel 对单元格值的处理方面遇到了一些困难,这些单元格值在 IEEE 754 浮点中不能完全表示。

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

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

<v>62408.000000000007</v>

该数字有 17 位有效数字,不能用 IEEE 754 浮点数精确表示。

在 Java 和 Python 中将字符串“62408.000000000007”解析为双精度浮点数会得到 62408.00000000001,它的有效数字少了一位,并且可以精确表示。这两种编程语言都声称实现了 IEEE 754(的子集)。

但是,带有该文件的 Excel 2010 和 2013 在 UI 中显示 62408(无论您在数字格式中指定多少个小数位,小数点后只会出现零)。所以 Excel 似乎将该单元格值准确解析为 62408。

任何人都可以为我指出有关应用程序应如何从单元格内的 SpreadsheetML (xlsx) 文件的 v 元素中解析浮点数的权威参考吗?

还有一个有用的参考是关于 Excel 是如何做到的。

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

但是,除了在这种情况下发现 v 元素的类型为 ST_Xstring 之外,我找不到任何关于如何解析单元格值的信息,尤其是数字。

【问题讨论】:

    标签: java python excel openxml


    【解决方案1】:

    任何人都可以向我指出有关应用程序应如何从单元格内的 SpreadsheetML (xlsx) 文件的 v 元素中解析浮点数的权威参考。

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

    Excel 使用标准 IEEE 754 浮点。在编写 xlsx 文件时,它需要将这些值编码为字符串,超过 15 位的任何数字变化都可能是由于 printf 样式格式。

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

    因此,要回答您问题的“应用程序应如何解析浮点数”部分;应用程序应该使用任何可用的库来解析它们,以将双精度的字符串表示形式转换为内存中的双精度。如果您的应用程序是使用与 Excel 相同的编译器编译的,那么您可能会通过相同的系统库获得完全相同的结果。如果不是,您可能会得到相同的结果。

    但是,这并不能保证该数字在实际上是双精度时会显示为 int。这是应用程序正在执行的 Excel 操作,与文件格式无关。

    所以 Excel 似乎将该单元格值准确解析为 62408。

    我认为 似乎 部分是完全正确的,并且您所看到的是由于表示层。如果某个值不能以 IEE754 格式准确表示,我怀疑 Excel 是否可以准确解析该值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      相关资源
      最近更新 更多