Bia*_*aga 18 php string floating-point implicit-conversion
我有字符串列表(大小,以字节为单位),我从文件中读取.假设其中一个字符串是2968789218,但是当我将其转换为float时,它变为2.00.
到目前为止这是我的代码:
$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00
Run Code Online (Sandbox Code Playgroud)
任何人?
问题实际上是编码.我改变文件编码现在没问题:D
Rap*_*tor 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;
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Original: 2.00
Corrected: 2968789218
Run Code Online (Sandbox Code Playgroud)
要检查您的PHP是32位还是64位,您可以:
echo PHP_INT_MAX;
Run Code Online (Sandbox Code Playgroud)
如果您的PHP是64位,它将打印出来9223372036854775807
,否则将打印出来2147483647
.
小智 5
尝试使用
$string = "2968789218";
$float = (double)$string;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
116737 次 |
最近记录: |