Java openxml和Excel 15位数字限制

Java openxml和Excel 15位数字限制,java,excel,floating-point,apache-poi,openxml,Java,Excel,Floating Point,Apache Poi,Openxml,我正在使用apache中的POI从java程序中的Excel文件读取数据。excel中有我用Java复制的宏,但当我比较结果时,有一些小的舍入差异,我正试图尽可能消除这些差异。 下载POI 3.13的代码并在调试模式下运行后,我意识到它们并没有像Excel那样处理数字,Excel只使用15位数字并在其后添加非有效0,而是使用17位数字的表示。你可以看到。 但更深入地说,POI似乎正在使用openxml,而且openxml单元已经将浮点数存储在17位而不是15位。。。所以在我看来,openxml在

我正在使用apache中的POI从java程序中的Excel文件读取数据。excel中有我用Java复制的宏,但当我比较结果时,有一些小的舍入差异,我正试图尽可能消除这些差异。 下载POI 3.13的代码并在调试模式下运行后,我意识到它们并没有像Excel那样处理数字,Excel只使用15位数字并在其后添加非有效0,而是使用17位数字的表示。你可以看到。 但更深入地说,POI似乎正在使用openxml,而且openxml单元已经将浮点数存储在17位而不是15位。。。所以在我看来,openxml在处理数字方面似乎存在一个缺陷,但我很惊讶,以前没有发现过像处理浮点数这样“大”的错误,因为我找不到任何关于它的信息

所以我的问题是:在使用POI时,是否有一种解决方法可以获得与Excel完全相同的15位数字?更好的是,在这个问题上,openxml可以像Excel那样进行修改吗

但我很惊讶,像处理浮点数这样糟糕的“大”问题以前从未被发现过

Excel对浮点的使用是错误的,这一点在的§2中有详细说明。当值实际上是53位二进制浮点值时,微软假装值是15位十进制浮点值的拙劣尝试只会让事情变得更糟,与其模仿它,还不如避免在严肃的计算中使用Excel。以下引用§2的结论:

Excel用户如何预测哪些函数根据显示而不是实际值进行操作?哪些表情在展示前会经过美容处理?用户的程序在没有意识到这些问题的情况下是无法调试的,一个有意识的用户最终调试的是微软虔诚的欺诈行为,而不仅仅是一个出现故障的Excel电子表格

但我很惊讶,像处理浮点数这样糟糕的“大”问题以前从未被发现过

Excel对浮点的使用是错误的,这一点在的§2中有详细说明。当值实际上是53位二进制浮点值时,微软假装值是15位十进制浮点值的拙劣尝试只会让事情变得更糟,与其模仿它,还不如避免在严肃的计算中使用Excel。以下引用§2的结论:

Excel用户如何预测哪些函数根据显示而不是实际值进行操作?哪些表情在展示前会经过美容处理?用户的程序在没有意识到这些问题的情况下是无法调试的,一个有意识的用户最终调试的是微软虔诚的欺诈行为,而不仅仅是一个出现故障的Excel电子表格


谢谢你的链接。我或多或少地了解到了这个问题,但就我而言,我并不想继续使用Excel。它是现在使用的工具,我将通过在Java程序中实现其中的宏来替换它。但我仍然从电子表格中得到初始值。我的目标是比较结果(目前不同),以确保宏正确实现。因此,即使我们可以争论Excel是否是最好的实现,openXML的目标是尽可能与Excel相似,但这里的情况并非如此。所以他们应该做同样的“装饰性”取整。谢谢这个链接。我或多或少地了解到了这个问题,但就我而言,我并不想继续使用Excel。它是现在使用的工具,我将通过在Java程序中实现其中的宏来替换它。但我仍然从电子表格中得到初始值。我的目标是比较结果(目前不同),以确保宏正确实现。因此,即使我们可以争论Excel是否是最好的实现,openXML的目标是尽可能与Excel相似,但这里的情况并非如此。所以他们应该做同样的“装饰性”取整。