You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中API返回非字符串型两位小数金额的解决方案

解决Laravel API返回带两位小数数值类型amount字段的问题

核心问题说明

JSON本身没有decimal类型,仅支持number类型。你遇到的问题本质是:既要保证amount是数值类型(非字符串),又要确保其精度为两位小数(业务逻辑上的精度,而非JSON的显示格式)。之前尝试的方法返回字符串,是因为number_format、BigDecimal等工具默认输出字符串来避免浮点精度问题,我们可以通过以下方式实现数值类型的精确返回。

可行解决方案

方案1:模型访问器 + JSON_NUMERIC_CHECK

在对应模型中定义访问器,确保amount字段返回精确到两位小数的数值:

class YourModel extends Model
{
    /**
     * 获取格式化后的amount字段
     */
    public function getAmountAttribute($value)
    {
        // 使用bcdiv避免浮点精度丢失,确保返回两位小数的数值
        return (float) bcdiv($value, 1, 2);
    }
}

在控制器返回响应时,启用JSON_NUMERIC_CHECK选项,强制将数值序列化为JSON的number类型:

return response()->json($yourModelInstance, 200, [], JSON_NUMERIC_CHECK);

方案2:API资源类处理

使用Laravel的API资源类(推荐用于复杂API场景),在资源中显式处理amount字段:

class YourModelResource extends JsonResource
{
    public function toArray($request)
    {
        return [
            'id' => $this->id,
            'amount' => (float) bcdiv($this->amount, 1, 2),
            // 其他需要返回的字段
        ];
    }
}

控制器中返回资源:

return new YourModelResource($yourModelInstance);

重要提示

JSON的number类型不会保留末尾的零(比如400.00会被序列化为400),但这并不影响数值的精度——后端返回的数值已经确保是两位小数的精度。如果业务方要求JSON中必须显示为400.00的形式,那只能使用字符串类型,但这与你的需求冲突,建议和需求方沟通确认:优先保证数值类型与精度,由前端负责格式化显示为两位小数。

内容的提问来源于stack exchange,提问作者Sahak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 09:35:03