大于2147483647的正整数仍会抛出InvalidArgumentException

时间:2014-09-17 21:38:49

标签: php integer

我有以下值对象SeriesNumber,它应该包含任何正整数。但是当我将值设置为大于2147483647的值时,会抛出错误,但这显然是一个正整数?

如何摆脱这种限制或奇怪的行为,以便我可以使用8750465442或更高版本作为我的系列号的值?

namespace Model\Domain\User\Value;

use \InvalidArgumentException;

class SeriesNumber
{
    private $value;

    public function __construct($value)
    {
        $this->setValue($value);
    }

    public function __toString()
    {
        return (string) $this->value;
    }

    private function setValue($value)
    {
        if (!(is_int($value) && $value >= 1)) {
            throw new InvalidArgumentException(sprintf('%s must be a positive integer.', __METHOD__));
        }

        $this->value = $value;
    }
}

2 个答案:

答案 0 :(得分:1)

C:\Users\Niet>php -r "var_dump(2147483647);"
int(2147483647)

C:\Users\Niet>php -r "var_dump(2147483648);"
float(2147483648)

注意第二个是一个整数,因为它超出了整数中可以保存的范围。因此,is_int返回false。

要修复,请考虑使用BCMath函数来处理任意大数。

答案 1 :(得分:1)

2147483647是最大可能的带符号32位整数。如果要表示更大的数字,则需要在64位计算机上运行64位PHP。

或者,您可以使用BCmath扩展名。

也就是说,您永远无法让计算机准确存储任何正整数。目前,任何高于2 ^ 64的东西最好保留为字符串。