Целое положительное число больше, чем 2147483647, все еще выбрасывает InvalidArgumentException

У меня есть следующий объект значения 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

Решение

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

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

Обратите внимание, как второй не целое число, потому что оно вышло за пределы того, что может быть сохранено в целое число. Следовательно, is_int возвращает ложь

Чтобы исправить это, рассмотрите возможность использования функций BCMath для обработки произвольно больших чисел.

1

Другие решения

2147483647 — это максимально возможное 32-разрядное целое число со знаком. Если вы хотите представить большие числа, вам нужно запустить 64-битный PHP на 64-битной машине.

В качестве альтернативы вы можете использовать BCMath расширение.

Тем не менее, вы никогда не сможете иметь компьютер точно хранить любой положительное число. На данный момент все, что выше 2 ^ 64, лучше всего хранить в виде строки.

1

По вопросам рекламы [email protected]