如何在 PHP 中使用精确的十进制值进行 json 解码



我有一个类似 json 字符串

{
    "a":0.0000051,
    "b":0.0000051,
    "c":0.0000051,
    "d":0.0000051
}

当我尝试将其解码为json_decode($json, true)它将所有值转换为其指数数时

array(4){
    ["a"]=> float(5.1E-6)
    ["b"]=> float(5.1E-6)
    ["c"]=> float(5.1E-6)
    ["d"]=> float(5.1E-6)
}

我想将 json 转换为十进制数具有相同值的数组,而无需转换为指数。

我该怎么做?

或者有没有其他方法可以将这些数字转换回十进制数?

首先只是将json数据存储在一个变量中,假设$json然后试试这个

$result = preg_replace("/("w+":s*?)(d+.?[^,}]*b)/imu",'$1"$2"',$json);
print_r($result);

由于您使用的是 PHP(一种松散类型的语言(,因此您可以将浮点值存储为 JSON 中的字符串值:

{
    "a": "0.0000051",
    "b": "0.0000051",
    "c": "0.0000051",
    "d": "0.0000051"
}

读取 json 时,您可以使用下面的代码片段将字符串值转换为浮点数:

$a_float =  (float) $a;

因为您想将 json 转换为具有相同十进制数值的数组而不转换为指数表示法,所以我认为这是要走的路。

让我们试试这个:

function float_to_string($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[$key] = float_to_string($value);
        }
        return $data;
    } else {
        if (is_float($data)) {
            $result = rtrim(number_format($data, 14), '0.');
            return $result === '' ? '0' : $result;
        } else {
            return $data;
        }
    }
}

用法

$json = '{
    "a":0.0000051,
    "b":0.00000051,
    "c":0.000000051,
    "d":0.0000000000051
}';
$data = json_decode($json, true);
$data = float_to_string($data);
print_r($data);

结果:

Array
(
    [a] => 0.0000051
    [b] => 0.00000051
    [c] => 0.000000051
    [d] => 0.0000000000051
)

演示:https://3v4l.org/PLNfU

最新更新