我在理解 Excel 处理不能用 IEEE 754 float 精确表示的单元格值时遇到了一些困难。
我的激励示例可以通过将 Excel 2010 或 2013 中的电子表格保存为 xlsx 格式并在工作表 1 的单元格 A1 中包含一个数字来实现。
然后,编辑底层 XML 并将该单元格的值替换为如下所示:
<v>62408.000000000007</v>
该数字有 17 位有效数字,不能用 IEEE 754 float 精确表示。
在Java和Python中将字符串“62408.000000000007”解析为 double float 得到62408.00000000001,有效数字少一位,可以精确表示。这两种编程语言都声称实现了 IEEE 754(的子集)。
但是,随该文件一起显示的 Excel 2010 和 2013 在 UI 中显示 62408(无论您在数字格式中指定多少位小数,小数点后仅显示零)。所以 Excel 似乎将该单元格值准确解析为 62408。
谁能给我指出应用程序应如何从单元格内的 SpreadsheetML (xlsx) 文件的 v 元素解析 float 的权威引用?
关于 Excel 如何执行此操作的权威引用也很有用。
我已尝试在 http://www.ecma-international.org/publications/standards/Ecma-376.htm 上检查 Office Open XML 标准引用文档。
但是,除了发现 v 元素在此上下文中的类型为 ST_Xstring 之外,我找不到任何关于如何解析单元格值的信息,尤其是作为数字。
最佳答案
Can anyone point me to a definitive reference for how applications should parse a floating point number from a SpreadsheetML (xlsx) file's v element inside a cell.
我怀疑是否存在这种情况,但我可以分享我使用四种不同的编程语言编写用于编写 xls 和 xlsx 文件的库的一些经验。
Excel 使用标准 IEEE 754 float 。在编写 xlsx 文件时,它需要将这些值编码为字符串,任何超过 15 位的数字变化都可能是由于 printf 样式格式造成的。
它可能将 62408.000000000007 显示为 62408,但在内部它仍将其作为 IEEE 754 double 处理。这在 xls 格式中更为明显,其中值被保存为 64 位 IEEE 754 double 值,就像它在内存中一样。
所以要回答您问题中“应用程序应如何解析 float ”部分;应用程序应该使用任何可用的库来解析它们,以将 double 的字符串表示形式转换为内存中的 double。如果您的应用程序是使用与 Excel 相同的编译器编译的,那么您可能会通过相同的系统库获得完全相同的结果。否则,您很可能会得到相同的结果。
但是,这并不能保证数字在真正为 double 时显示为 int。这是应用程序正在执行的 Excel 操作,与文件格式无关。
So Excel seems to parse that cell value as 62408 exactly.
我认为似乎 部分是完全正确的,您所看到的是由于表示层。如果某个值不能以 IEE754 格式准确表示,我怀疑 Excel 能否准确解析该值。
关于java - 电子表格ML : How should consuming applications parse floating-point numbers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24012503/