【问题标题】:Handling large numbers in PHP在 PHP 中处理大数
【发布时间】:2012-01-11 02:26:51
【问题描述】:

几分钟后,我意识到我遇到的错误:神奇的2147483647 数字,即 PHP/32 上integer 类型的上限。我需要在我的函数中管理更大的数字:

public function albumExists($name) // e.g. 104112826372452
{
   $albums = $this->getAlbums();

   // If $name is int, search the key in $albums
   if(is_int($name) && ($found = array_key_exists($id = intval($name), $albums)))
      return ($found ? $id : false);

   // Start looking for $name as string
   foreach($album as $id => $a) if ($a->name == $name) return intval($id);

   return false; // Found nothing
}

为了能够同时通过idname 进行搜索。但是intval() 总是会返回上限。如何处理相当大的数字,比如104112826372452?想法?

编辑:用法示例:

$album = $fb->createAlbum('Test Album'); // Will return album id
// The use albumExists to check if id exists
$photo1 = $fb->uploadPhoto('mypic1.png', null, $album); 
$photo2 = $fb->uploadPhoto('mypic2.png', null, 'Test Album'); // find or create

【问题讨论】:

    标签: php types int


    【解决方案1】:

    如果您出于理智的目的而转换为 int(看起来如此),也许您可​​以调整它以纯粹根据它的数字而不是 int 数据类型来评估它:

    if(ctype_digit($name) && ($found = array_key_exists($id = $name, $albums)))
          return ($found ? $id : false);
    //etc
    

    实际上,这也应该有效吗?

    if(ctype_digit($name) && ($found = array_key_exists($name, $albums)))
          return ($found ? $name: false);
    //etc
    

    【讨论】:

      【解决方案2】:

      作为解决方法,您可以为此使用gmpbcmath 函数。

      您为什么坚持转换为 PHP 整数还不是很清楚。当不需要用它们计算时,只需将数据库编号保留为字符串。并非所有看起来像数字的东西都需要表示为数字。

      我猜你真正的问题是与is_int() 的区别。只需使用 is_numeric() 代替它,它适用于任意长度的数字字符串,并且不依赖于整数转换的值。

      【讨论】:

        【解决方案3】:

        int 有一个上限,而较大的数字 将表示为floats,这是不精确的,因此在这种情况下使用是个坏主意。如果您需要对其进行计算,请使用string 来存储此类数字和BC Math 扩展名。

        【讨论】:

        • 但是使用 string 我将无法同时通过 id 和 name 提供搜索...我说的对吗?
        • 因为我可以将专辑名称或 ID 传递给该函数。将两者都作为字符串传递,我将无法区分搜索方式。
        • @Gremo 您仍然可以检查名称是否仅包含数字,或者您可以使 API 不那么含糊。
        【解决方案4】:

        不幸的是,PHP int 类型只能达到 2147483647,但 PHP float 可以容纳最大 10000000000000 的整数

        查看 php.net http://php.net/manual/en/language.types.integer.php

        更新

        PHP.net 说 float 可以准确地将 integer 保存到 10000000000000。我不确定 float 是否有上限。

        【讨论】:

          【解决方案5】:

          一种选择是在64bit 操作系统上运行 PHP,因为大小由底层操作系统决定。这显然取决于您是否可以访问64bit 硬件,需要注意的一点是这将比使用gmp/bcmath 更快,但除非您的目标是纯粹的速度,否则它可能不会成为问题你

          【讨论】:

            猜你喜欢
            • 2017-12-02
            • 2017-06-05
            • 2012-05-27
            • 1970-01-01
            • 1970-01-01
            • 2014-06-12
            • 1970-01-01
            • 2017-09-21
            • 1970-01-01
            相关资源
            最近更新 更多