Ответ 1
Удивительно, что ответа нет. Проблема существует только в 32-битном PHP.
В документации,
Если строка не содержит символов ".", "e" или "E", а числовое значение вписывается в ограничения типа целочисленного типа (как определено в PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как float.
Другими словами, $string
сначала интерпретируется как INT, вызывающий переполнение (значение $string
2968789218 превышает максимальное значение (PHP_INT_MAX
) 32-битного PHP, что 2147483647.), затем оценивается как float на (float)
или floatval()
.
Таким образом, решение:
$string = "2968789218";
echo 'Original: ' . floatval($string) . PHP_EOL;
$string.= ".0";
$float = floatval($string);
echo 'Corrected: ' . $float . PHP_EOL;
который выводит:
Original: 2.00
Corrected: 2968789218
Чтобы проверить, является ли ваш PHP 32-разрядным или 64-разрядным, вы можете:
echo PHP_INT_MAX;
Если ваш PHP-64-разрядный, он распечатает 9223372036854775807
, иначе он распечатает 2147483647
.