我有字符串列表(大小以字节为单位),我从文件中读取这些。假设其中一个字符串是 2968789218,但是当我将其转换为浮点数时,它变为 2.00。
到目前为止,这是我的代码:
$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00
任何人?
解决了
问题实际上是编码。现在我更改文件编码时很好:D
我有字符串列表(大小以字节为单位),我从文件中读取这些。假设其中一个字符串是 2968789218,但是当我将其转换为浮点数时,它变为 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
值2968789218PHP_INT_MAX
超过了32 位 PHP的最大值 ( ),即2147483647。),然后计算为浮动(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);
尝试使用
$string = "2968789218";
$float = (double)$string;
如果函数 floatval 不起作用,您可以尝试这样做:
$string = "2968789218";
$float = $string * 1.0;
echo $float;
但对我来说,之前的所有答案都有效(在http://writecodeonline.com/php/中尝试)也许问题出在您的服务器上?