将字符串转换为float时的奇怪结果

gui*_*ume 3 php floating-point

我想将一个字符串转换为float但我有一些问题.这是我的代码

    $dataValue = $item[$data];
    $dataValue = trim($dataValue);
    var_dump($dataValue);echo "<br>";
    $dataValue = str_replace(',', '.', $dataValue);
    var_dump($dataValue);echo "<br>";
    var_dump(floatval($dataValue));echo "<br>";
    var_dump(floatval('4.02'));echo "<br>";
Run Code Online (Sandbox Code Playgroud)

结果

string(7) "4,02"
string(7) "4.02"
float(4)
float(4.02)
Run Code Online (Sandbox Code Playgroud)

我不明白第三个结果,为什么我有4而不是4.02?

谢谢

编辑:

我的新代码:

$dataValue = $item[$data];

        echo mb_detect_encoding($dataValue) . "<br>";

        $dataValue = iconv('ASCII', 'UTF-8//TRANSLIT', $dataValue);
        $dataValue = trim($dataValue);
        $dataValue = str_replace(',', '.', $dataValue);

        echo mb_detect_encoding($dataValue) . "<br>";

        var_dump($dataValue);echo"<br >";
        $dataValue = mb_convert_encoding($dataValue, "UTF-8");
        var_dump($dataValue);echo"<br >";
        $dataValue = str_replace(',', '.', $dataValue);
        $dataValue = floatval($dataValue);
        var_dump($dataValue);echo"<br >";`
Run Code Online (Sandbox Code Playgroud)

结果

ASCII
ASCII
string(7) "4.02"
string(7) "4.02"
float(4)
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 5

只有4个可见字符,但var_dump()声称有7个.我猜测在小数点之前有一个不可见的字符导致floatval()过早地终止转换.您可以通过查看内容的十六进制转储来验证这一点$dataValue.

编辑:

您的字符串似乎以UTF-16LE编码.在处理之前使用mb或iconv将其转换为ASCII/UTF-8.