【问题标题】:openxml and Excel 15 digits number limitopenxml 和 Excel 15 位数字限制
【发布时间】:2016-02-12 17:23:06
【问题描述】:

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

所以我的问题是:在使用 POI 时,是否有一种解决方法可以获得完全相同的 15 位 Excel?更好的是,openxml 是否可以被纠正为在这件事上表现得像 Excel?

【问题讨论】:

    标签: java excel floating-point apache-poi openxml


    【解决方案1】:

    但我很惊讶之前没有发现像处理浮点数一样“大”的东西

    Excel 对浮点的使用是错误的,this article 的 §2 中有详细记载。微软试图假装值是 15 位十进制浮点数而实际上是 53 位二进制浮点数只会让事情变得更糟,而不是模拟它,您应该避免使用 Excel 进行严肃的计算。这是§2结论的引述:

    Excel 用户如何预测显示的函数而不是实际值?哪些表情在显示之前会在外观上变圆?用户的程序在不了解这些问题的情况下无法调试,而有意识的用户最终会调试 Microsoft 的虔诚欺诈,而不仅仅是故障的 Excel 电子表格。

    【讨论】:

    • 感谢您提供此链接。我或多或少地遇到了这个问题,但就我而言,我不想继续使用 Excel。它是现在使用的工具,我将通过在 Java 程序中实现其中的宏来替换它。但我仍然从电子表格中获取初始值。我的目标是比较结果(现在不同),以确保正确实现宏。因此,即使我们可以争论 Excel 是否是最好的实现,openXML 的目标是尽可能与 Excel 相似,而这里并非如此。所以他们应该做同样的“美容”四舍五入。
    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 2020-08-15
    相关资源
    最近更新 更多