我有以下值对象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;
}
}
答案 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的东西最好保留为字符串。