我有字符串列表(大小以字节为单位),我从文件中读取了这些字符串。假设其中一个字符串是2968789218,但当我将其转换为float时,它变为2.00。
到目前为止,这是我的代码:
$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00
任何?
问题实际上是编码。我改变文件编码现在没问题:D
答案 0 :(得分:18)
令人惊讶的是,没有人接受答案。该问题仅存在于32位PHP中。
如果字符串中不包含任何字符'。',' e'或' E'并且数值适合整数类型限制(由PHP_INT_MAX定义),该字符串将被计算为整数。在所有其他情况下,它将被评估为浮动。
换句话说,$string
首先被解释为INT,这会导致溢出($string
值 2968789218 超过最大值(PHP_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
。
答案 1 :(得分:9)
$ float = floatval($ string);
答案 2 :(得分:5)
尝试使用
$string = "2968789218";
$float = (double)$string;
答案 3 :(得分:0)
如果函数floatval不起作用,你可以尝试这样做:
$string = "2968789218";
$float = $string * 1.0;
echo $float;
但对我来说,之前的所有答案都有效(在http://writecodeonline.com/php/中尝试) 也许问题在你的服务器上?