【问题标题】:PHP - How to eval math with big integer result?PHP - 如何用大整数结果评估数学?
【发布时间】:2015-12-24 02:44:18
【问题描述】:

我有这样的问题 当我评估这个

$a='820725059 + 35 * 4082615 + 6209777 - 6476390779 * 3376849 + 3 - 8089 * 3967379273 - 0 * 55111452';
eval('return ('.$a.');');

我得到了这个结果 -2.1901884886788E+16 而不是 -21901884886788304

我知道 BCMath,但是如何计算这样的多重运算?

注意: 我的问题是关于打印为 BIG INT

【问题讨论】:

标签: php eval bigint


【解决方案1】:

我假设这行“如何计算这样的多重运算?”意思是“如何为任意用户提交的数学表达式编写计算器?”,这就是为什么你首先使用eval

如果您使用 eval 而不是未经处理的用户提交的输入,您将失败,请记住这一点作为经验法则。

无论如何,你无法用 eval 解决这个问题,如果你想使用 bignums,你必须使用 BCMath 操作。

正确的解决方案是对输入进行标记并构建数学运算树,本质上是为描述数学表达式的简单语言编写解释器。

这是用 5 秒谷歌搜索之前已经完成的事情的结果:https://github.com/michellesanver/Calculator 您可以接受她的工作,并用 BCMath 方法替换 Addition 等类中普通数学运算符的使用。

【讨论】:

    【解决方案2】:

    检查您使用的是 32 位还是 64 位 PHP

    echo PHP_INT_SIZE; //4 is 32bit, 8 is 64bit
    

    32bit 不会处理这个整数,对于 64bit 结果是 -21901884886788304

    如果您必须使用 32 位,请尝试使用 GMP,然后自己解析整数(祝您好运...)

    另一种解决方案是编写非常基本的 Python 程序(或任何其他可以轻松处理大量数字的语言)并将其作为参数发送到 exec 函数并让其他语言为您解析它(Python 可以处理非常大数字很​​容易)

    【讨论】:

    • 我使用 ubuntu 64bit,并回显 PHP_INT_SIZE;我有 8 个
    猜你喜欢
    • 1970-01-01
    • 2022-08-13
    • 2020-06-06
    • 2010-12-05
    • 1970-01-01
    • 2012-03-07
    • 2011-07-17
    相关资源
    最近更新 更多