php中保留json小数点后零的关键是提前将数值转为字符串,而非依赖json_encode配置;最可靠方法是用number_format()格式化为固定位数字符串再序列化。

PHP 中让 JSON 输出保留小数点后零(比如 100.00 而不是 100.0 或 100),关键不是“设置 json_encode”,而是**不让浮点数以数字类型进入序列化流程**——因为 JSON 规范本身不区分 100.00 和 100.0,json_encode() 也只输出最简数值表示。
用 number_format() 把字段转成带零的字符串
这是最常用、最可靠的做法。对需要保留零的小数字段,提前用 number_format() 格式化为固定位数的字符串:
-
$data['price'] = number_format(100, 2, '.', '');→"100.00" -
$data['rate'] = number_format(8.5, 2, '.', '');→"8.50" -
$data['discount'] = number_format(0.00, 2, '.', '');→"0.00"
这样 json_encode($data) 输出的就是 {"price":"100.00","rate":"8.50","discount":"0.00"} ——引号内的字符串天然保留所有零。
别指望 JSON_PRESERVE_ZERO_FRACTION 解决这个问题
这个 flag 在 PHP ≥ 7.1 可用,但它只对“整数值的浮点”生效,例如:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
json_encode(['x' => 100.0], JSON_PRESERVE_ZERO_FRACTION)→{"x":100.0} -
json_encode(['x' => 100.5], JSON_PRESERVE_ZERO_FRACTION)→{"x":100.5}(不会变成100.50)
它不控制小数位数,也不补零,对 100.5、8.3 这类值完全无效。
避免踩坑的几个操作细节
实际写代码时容易出错的地方:
- 不要用
(string)$float—— 它可能输出"100"、"8.5"或科学计数法,不可控 - 不要用
sprintf('%.2f', $float)处理可能超精度的值(如0.1 + 0.2),先round($val, 2)再格式化更稳妥 - 如果字段来自数据库 DECIMAL,读取时别自动 cast 成 float;保持为字符串或用
number_format((float)$val, 2)显式处理 - 前端拿到字符串后若需计算,要用
parseFloat()或Number(),但要注意业务是否允许丢零(比如金额展示必须显示.00)
如果非要输出数字类型(不带引号)怎么办?
严格来说,JSON 数字类型无法强制保留末尾零——100.00 和 100.0、100 在解析后都是同一个数值。若 API 合约硬性要求“数值类型 + 固定位数”,唯一办法是:
- 前端约定:接收到的数字统一按两位小数格式化展示(如
value.toFixed(2)) - 后端不干预 JSON 数值输出,只确保原始计算无误差(例如金额用分存储、用
round()截断) - 跨语言对接(如 Java)时,优先传字符串或整型缩放值,避免浮点直传
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










