PHP大浮点数字符串转浮点型的JSON编码解决方案求助
解决方案
由于PHP原生float类型无法精确存储19位有效数字的数值,且JSON_NUMERIC_CHECK会因数值过大导致精度丢失或转换失效,我们可以通过手动替换JSON字符串中的大浮点数引号来实现需求:
实现步骤
- 先对数组进行普通JSON编码(不使用
JSON_NUMERIC_CHECK),保留所有字符串格式的数值; - 使用正则表达式匹配符合格式的大浮点数字符串,移除其前后的引号,将其转换为JSON的数值类型。
示例代码
<?php $array = [ "big_float1" => "9876543210999999999.01", "big_float2" => "9876543210999999999.01", "float1" => 2.2 ]; // 普通JSON编码,保留原格式 $json = json_encode($array); // 正则匹配带2位小数的数字字符串,替换为数值格式 $pattern = '/"(\d{1,}\.\d{2})"/'; $json = preg_replace($pattern, '$1', $json); echo $json; ?>
输出结果
{"big_float1":9876543210999999999.01,"big_float2":9876543210999999999.01,"float1":2.2}
注意事项
- 可根据实际数值格式调整正则表达式,比如要兼容整数形式的大数值,可修改为
/"(\d{1,}(\.\d{1,})?)"/; - 该方式不会触发PHP的float类型转换,因此不会丢失精度,JSON解析器会根据自身数值类型规则(如JavaScript的Number/BigInt)处理这些值。
内容的提问来源于stack exchange,提问作者B.Mossavari
相关产品推荐
相关产品推荐

