【问题标题】:How to calculate actual values from Excel like 1.30389E+15 in PHP?如何从 Excel 中计算实际值,如 PHP 中的 1.30389E+15?
【发布时间】:2018-07-24 20:57:33
【问题描述】:

我看到 Excel 中显示了一些值,例如 - 1.30389E+15 它的原始值为1303890710980110

有人知道如何在 PHP 中将其转换回原始值吗?

我尝试搜索它,但从未成功。我目前不知道这到底叫什么,以便我可以搜索确切的术语。

【问题讨论】:

  • 您应该尝试将单元格类型设置为“数字”,因为默认为“通用”
  • 这与1.30389 * 10^15 的含义相同,但这不会给您完全相同的数字。
  • 数字被电子表格应用程序自动转换(并四舍五入 (!))为科学记数法后,您将无法在 PHP 中将其转换回。

标签: php excel csv


【解决方案1】:

正如您提出的问题,电子表格应用程序将您的数据 1303890710980110 转换为 1.30389E+15,同时明显降低了十倍的精度。之后在 PHP 中什么都不能做以恢复精度。这些步骤必须在从电子表格应用导出数据之前完成。

您必须在电子表格应用程序中更改包含这些数字的单元格的格式,以便以后能够以相同的精度处理它。

你必须:

  • 更改单元格格式Number(正如@Davide Effe 建议的那样)
  • 拉伸单元格宽度足够宽以使数字(以正常形式)适合(重要:电子表格应用程序自动转换 这些同时降低了科学记数法的精度,因为 它需要更小的宽度来适应)

完成后,导出的数据应该是正确的格式和完整的精度。

【讨论】:

    【解决方案2】:

    您可以使用number_format来实现转换。

    echo number_format(1.30389E+15);

    输出:1,303,890,000,000,000

    上面发布的输出与您的原始值 1303890710980110 不匹配,但这就是您转换科学记数法的方式。

    为了获得您提到的原始值,符号应如下所示1.30389071098011E+15

    检查只需运行:echo number_format(1.30389071098011E+15);

    这会给你1,303,890,710,980,110,原始值。

    【讨论】:

    • 也许它不匹配,因为 excel 做了一些事情来改变你的原始价值?如果您将小数点移动 15 位,因为 E+15 表示您将得到我从 (1.30389E+15) 得到的值。
    【解决方案3】:

    PHP_INT_MAX 的大小取决于你的 PHP 解释器的架构:

    • 在 32 位 PHP 中为 2,147,483,647
    • 在 64 位 PHP 中为 9,223,372,036,854,775,807

    比较涉及的数字:

        1,303,890,710,980,110 -> Excel value
                2,147,483,647 -> 32-bit max value
    9,223,372,036,854,775,807 -> 64-bit max value
    

    ...结论是:

    • 如果您需要一个可移植的解决方案(或者您的服务器是 32 位的),您必须将其作为字符串处理。只是没有别的办法。如果您碰巧需要数学,您还需要一个任意精度库,例如 GMPBCMath

    • 否则,只要已知所有数字都适合 64 位范围,您就不需要执行任何特殊操作。

    您问题中含糊的部分是数字如何从 Microsoft Excel 传输到您的 PHP 脚本。我假设您正在使用第三方库、ODBC 或两者。如果它们在到达您时已经“损坏”(即转换为浮点数),那么您无法恢复丢失的精度。

    您应该问自己的另一个问题是您是否有实数或它们只是字母数字代码。

    【讨论】:

    • 这很有趣。谢谢。
    猜你喜欢
    • 2022-01-04
    • 1970-01-01
    • 2020-02-22
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多