У меня есть список строк (размер в байтах), я читаю их из файла. Скажем, одна из строк – 2968789218, но когда я конвертирую ее в float, она становится 2.00.
Это мой код:
$string = "2968789218"; $float = (float)$string; //$float = floatval($string); //the result is same // result 2.00
Кто угодно?
На самом деле проблема заключалась в кодировании. Теперь отлично, когда я меняю кодировку файла: D
Удивительно, но ответа нет. Проблема существует только в 32-битном PHP.
Из документации ,
Если строка не содержит символов «.», «E» или «E», а числовое значение вписывается в ограничения типа целочисленного типа (как определено PHP_INT_MAX), строка будет оцениваться как целое число. Во всех остальных случаях он будет оцениваться как плавающий.
Другими словами, $string
сначала интерпретируется как INT, которая вызывает переполнение (значение $string
2968789218 превышает максимальное значение ( PHP_INT_MAX
) 32-битного PHP, которое равно 2147483647. ), А затем вычисляется как float by (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
.
$ float = floatval ($ string);
Ссылка: http://www.php.net/floatval
Попробуйте использовать
$string = "2968789218"; $float = (double)$string;
Если функция floatval не работает, вы можете попробовать сделать следующее:
$string = "2968789218"; $float = $string * 1.0; echo $float;
Но для меня все предыдущий ответ сработал (попробуйте в http://writecodeonline.com/php/ ). Может быть, проблема на вашем сервере?