在Laravel中如何将float浮点数值转换为保留2位小数的格式
Laravel 中保留 productivity 字段两位小数的实现方案
你可以根据自身业务场景选择以下三种实现方案:
方案1:控制器计算时直接处理后存储
适合需要把格式化后的值直接存入数据库的场景,修改控制器计算逻辑即可:
// 先计算总时长避免重复取值 $total_time = $request->input('admin_time') + $request->input('driving_time') + $request->input('work_time'); // 使用 round 函数四舍五入保留2位小数,返回float类型符合字段定义 $energy->productivity = round($request->input('work_time') / $total_time, 2); // 若需要截断小数而非四舍五入(0.727273直接取0.72),可以改用以下写法 // $energy->productivity = floor(($request->input('work_time') / $total_time) * 100) / 100;
方案2:视图层输出时格式化
适合需要保留数据库中原始精度,仅在前端展示时格式化的场景,直接修改Blade视图代码:
{{-- 使用 number_format 会自动补全两位小数,比如0.7会展示为0.70 --}} <td>{{ number_format($data->productivity, 2, '.', '') }}</td> {{-- 仅需要四舍五入不需要补零的话可以用round --}} {{-- <td>{{ round($data->productivity, 2) }}</td> --}}
方案3:模型定义访问器(推荐多场景复用)
如果多个业务端都需要用到格式化后的 productivity 值,可以在模型中定义访问器,无需重复写格式化逻辑:
在App\Models\Energy模型中添加对应代码:
Laravel 9+ 版本写法
use Illuminate\Database\Eloquent\Casts\Attribute; protected function productivity(): Attribute { return Attribute::make( get: fn ($value) => round($value, 2), // 存储时自动格式化可以加上set逻辑 // set: fn ($value) => round($value, 2) ); }
Laravel 8 及更早版本写法
public function getProductivityAttribute($value) { return round($value, 2); }
定义后直接调用$data->productivity就会自动返回保留两位小数的结果,原有业务代码无需修改。
注意:如果你的数据库float字段存在精度丢失问题,建议将字段类型改为decimal(10,2),从存储层面固定小数位。
内容的提问来源于stack exchange,提问作者sifakale
相关产品推荐
相关产品推荐

