繁体   English   中英

SpreadsheetML:消费应用程序应如何解析浮点数?

[英]SpreadsheetML: How should consuming applications parse floating-point numbers?

我在理解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之外,我找不到任何有关如何解析单元格值(尤其是数字)的信息。

谁能指出我有关应用程序应如何从单元格内SpreadsheetML(xlsx)文件的v元素解析浮点数的权威性参考。

我怀疑其中有一种,但是我可以分享一些我的经验,这些经验来自于编写库,以四种不同的编程语言编写xls和xlsx文件。

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

它可能将62408.000000000007显示为62408,但在内部仍将其作为IEEE 754双重值进行处理。 这在xls格式中更为明显,在xls格式中,该值像在内存中一样被保存为64位IEEE 754 double。

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

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

因此,Excel似乎准确地将该单元格值解析为62408。

我认为看来部分是完全正确的,并且您看到的是由于表示层。 我怀疑Excel是否能够正确解析IEE754格式的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM