将字符串转换为浮点数/双精度浮点数的PHP方法

23

我有一组字符串(以字节为大小),这些字符串是从文件中读取的。假设其中一个字符串是2968789218,但是当我将其转换为浮点数时,它变成了2.00。

到目前为止,这是我的代码:

$string = "2968789218";
$float = (float)$string;
//$float = floatval($string);
//the result is same
// result 2.00

有人吗?

已解决

问题实际上是编码问题。当我改变文件编码时,现在它就没问题了 :D


3
对我来说运行得很好? - adeneo
1
这对我来说不好 :( - Bias Tegaralaga
你尝试过使用(int)吗?还是你确实需要一个浮点数? - adeneo
在32位系统中,(int)会导致溢出。最大值为2147483647。 - Raptor
4个回答

21

令人惊讶的是,没有被接受的答案。该问题仅存在于32位PHP中。

根据文档

如果字符串不包含字符“.”、“e”或“E”,并且其数字值适合整数类型限制(由PHP_INT_MAX定义),则该字符串将被视为整数。在所有其他情况下,它将被视为浮点数。

换句话说,首先将$string解释为INT,这会导致溢出($string2968789218超过了32位PHP的最大值(PHP_INT_MAX),该值为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


这并不是完全清楚的。有必要将floatval结果存储在变量中,而不是直接在echo中调用函数吗? - ADTC

9

5
尝试使用

标签


$string = "2968789218";
$float = (double)$string;

5
在PHP中,(double)(real)并不存在,因此将数据转换成这些类型会转换成(float),这就是提问者正在做的事情。 - adeneo
我这边看起来没问题。你在使用哪个平台?阅读更多关于float的内容。 - Sid
我的服务器有问题吗?我使用来自RedHat OpenShift的免费服务器https://frodo-baggins.rhcloud.com/info.htm - Bias Tegaralaga
抱歉,我无法确定是什么导致了这个问题。 - Sid
你的系统是32位还是64位? - Satish Gadhave
显示剩余2条评论

0
如果函数floatval无法正常工作,您可以尝试这样做:
    $string = "2968789218";
    $float = $string * 1.0;
    echo $float;

但对我来说,所有之前的答案都有效(在http://writecodeonline.com/php/中尝试一下) 也许问题出在你的服务器上?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接