java - 电子表格ML : How should consuming applications parse floating-point numbers?

标签 java python excel openxml

我在理解 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/

相关文章:

java - Java 字符串的奇怪行为

java - 解析器忽略的 Xml 默认属性值

Python正则表达式匹配不在引号之间的某些字符

Java:所有进程都运行在同一个 JVM 下吗?

python - 有没有办法将用户代理包含在错误日志中?

python - Pytorch:无法使用 ImageFolder 加载图像

excel - VBA 预期 :end of statement

excel - 我在工作表 1 上输入了 VBA 代码。我希望代码在工作表 2 上运行。我是否只需将代码从工作表 1 复制到工作表 2?

Excel 迷你图打印问题

java - Gradle 依赖项 - 用一个模块替换另一个