Laravel 数据库中 decimal 字段数值被截断问题的完整解决方案

轻静同学_7567

轻静同学_7567

2026-08-14

932人浏览

原创

Laravel 数据库中 decimal 字段数值被截断问题的完整解决方案

laravel 项目中,当将带小数的数值(如 20.10)存入数据库 quantity 字段时出现自动舍入(变成 20),根本原因在于数据库字段类型定义不当或模型/框架未正确处理浮点精度,需结合数据库结构、数据传递与 laravel 类型转换三方面统一修复。

laravel 项目中,当将带小数的数值(如 20.10)存入数据库 quantity 字段时出现自动舍入(变成 20),根本原因在于数据库字段类型定义不当或模型/框架未正确处理浮点精度,需结合数据库结构、数据传递与 laravel 类型转换三方面统一修复。

在 Laravel(或基于 CodeIgniter 的自定义框架,如本例所示)中遇到 quantity 字段数值被意外舍入(例如输入 20.10 却存为 20),通常并非 Laravel 本身“主动四舍五入”,而是由以下任一或多个环节导致:

✅ 1. 数据库字段类型必须精确匹配业务需求

VARCHAR 或 INT / TINYINT 等整型字段绝对不可用于存储带小数的数量值。即使你已改为 DECIMAL,若定义不恰当仍会截断:

-- ❌ 错误:DECIMAL(10,0) → 小数位为 0,所有小数部分被丢弃
-- ✅ 正确:根据业务场景预留足够精度,例如:
ALTER TABLE `pur_order_detail` 
MODIFY COLUMN `quantity` DECIMAL(12,4) NOT NULL DEFAULT '0.0000';
  • DECIMAL(12,4) 表示最多 12 位数字,其中 4 位为小数(支持如 99999999.9999);
  • 若业务中 quantity 最大为 9999.99,推荐 DECIMAL(8,2);若需更高精度(如化工/医药计量),用 DECIMAL(12,4) 更稳妥。

⚠️ 注意:执行 ALTER TABLE 后务必清空缓存并验证表结构(DESCRIBE pur_order_detail),避免因旧结构残留导致无效修改。

✅ 2. 确保传入数据未被隐式类型转换

检查 $data['quantity'] 在进入 insert_batch() 前是否已被 PHP 强制转为整数或浮点数丢失精度:

// 在 foreach 循环中添加调试日志(开发环境)
foreach($rq_val as $key => $rq){
    \Log::info('Raw quantity before insert', ['raw' => $rq['quantity'], 'type' => gettype($rq['quantity'])]);
    if($rq['item_code'] != ''){
        array_push($es_detail, $rq_val[$key]);
    }
}

常见陷阱:

Laravel Creem Agent
Laravel Creem Agent

Creem 支付商店助理 — 查询订阅、客户、交易、产品,执行心跳检查,管理本地 Laravel支付商店。

下载
  • 使用 (int) 强转或 intval() —— 直接丢弃小数;
  • floatval() 在某些 PHP 版本或精度设置下可能产生 20.099999999999998,再经 round() 或数据库隐式转换后变为 20;
  • 正确做法:保持字符串原始格式传入,或使用 number_format($val, 4, '.', '') 标准化小数位。

✅ 3. 验证框架层是否启用自动类型转换(Laravel 特有)

虽然本例使用的是 CodeIgniter 风格 DB 操作,但若后续迁移到 Laravel Eloquent,务必在 Model 中显式声明 $casts:

// app/Models/PurOrderDetail.php
protected $casts = [
    'quantity' => 'decimal:4',
    'unit_price' => 'decimal:4',
    'total_money' => 'decimal:2',
];

该配置确保 Eloquent 自动将数据库读取的 DECIMAL 值作为高精度 string 或 float 处理,并在写入前按指定精度格式化,避免 PHP 浮点误差。

✅ 4. 补充建议:批量插入前做数据校验

在 insert_batch() 前统一规范化小数位,提升健壮性:

foreach($es_detail as &$detail) {
    // 强制保留 4 位小数,避免前端传入 '20.1' 或 '20.10000' 导致不一致
    $detail['quantity'] = number_format((float)$detail['quantity'], 4, '.', '');
    $detail['unit_price'] = number_format((float)$detail['unit_price'], 4, '.', '');
    $detail['total_money'] = number_format((float)$detail['total_money'], 2, '.', '');
}

? 总结

解决 quantity 被舍入的核心路径是:
? 数据库层:使用 DECIMAL(M,N) 替代 VARCHAR/INT,且 N ≥ 2(推荐 N=4);
? 应用层:避免任何 intval()/(int) 操作,优先以字符串或标准化 number_format 传递;
? 框架层(Laravel):通过 $casts 显式声明 decimal 类型及精度;
? 验证层:在入库前打印/日志原始值,确认问题发生在哪一环。

完成上述调整后,20.10 将原样存入数据库并准确返回,彻底规避“神秘舍入”问题。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

laravel

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
laravel组件介绍
laravel组件介绍

laravel 提供了丰富的组件,包括身份验证、模板引擎、缓存、命令行工具、数据库交互、对象关系映射器、事件处理、文件操作、电子邮件发送、队列管理和数据验证。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

857

10

laravel中间件介绍
laravel中间件介绍

laravel 中间件分为五种类型:全局、路由、组、终止和自定。想了解更多laravel中间件的相关内容,可以阅读本专题下面的文章。

2024.04.09

835

9

laravel使用的设计模式有哪些
laravel使用的设计模式有哪些

laravel使用的设计模式有:1、单例模式;2、工厂方法模式;3、建造者模式;4、适配器模式;5、装饰器模式;6、策略模式;7、观察者模式。想了解更多laravel的相关内容,可以阅读本专题下面的文章。

2024.04.09

2468

10

thinkphp和laravel哪个简单
thinkphp和laravel哪个简单

对于初学者来说,laravel 的入门门槛较低,更易上手,原因包括:1. 更简单的安装和配置;2. 丰富的文档和社区支持;3. 简洁易懂的语法和 api;4. 平缓的学习曲线。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.04.10

3841

7

laravel入门教程
laravel入门教程

本专题整合了laravel入门教程,想了解更多详细内容,请阅读专题下面的文章。

2025.08.05

5470

22

laravel实战教程
laravel实战教程

本专题整合了laravel实战教程,阅读专题下面的文章了解更多详细内容。

2025.08.05

3636

13

laravel面试题
laravel面试题

本专题整合了laravel面试题相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.05

6869

7

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

2026.03.04

1416

29

Laravel 框架安装指南
Laravel 框架安装指南

本指南详解 Laravel 框架安装全流程,涵盖 PHP 8.1+ 环境配置、Composer 依赖管理工具安装及国内镜像源优化。重点演示使用 composer create-project 命令创建 Laravel 10/11 项目,解决常见安装错误与依赖冲突。从环境搭建到项目初始化,助您快速完成 Laravel 开发环境部署,为后续 Web 应用开发奠定基础。适合 PHP 初学者与框架迁移开发者参考。

2026.04.09

195

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 201人学习

Composer手册
Composer手册

共0课时 | 0人学习