如何在MariaDB设置2位小数?Laravel返回值精度异常求助
问题解答:浮点数精度异常与MariaDB小数位设置
一、1.68返回值出现精度异常的原因
这是二进制浮点数的固有精度缺陷导致的:
- 十进制中的1.68无法被二进制浮点数精确表示,它在二进制中是无限循环的小数,存储和读取时会产生近似值,最终在PHP输出时就变成了
1.6800000000000002;而1.67的二进制表示刚好能被近似到不会显示多余小数位的程度。 - 哪怕数据库里存的是精确的DECIMAL类型值(1.68),如果Laravel模型未正确定义字段类型(比如默认按float处理),或者资源类直接输出时PHP自动将DECIMAL值转为float类型,就会触发这个精度问题。
除了你用的round()临时方案,还可以用这些方法彻底解决:
- 在Laravel资源类中用
number_format($this->settlement_factor, 2)强制保留两位小数; - 在模型的
$casts属性里添加'settlement_factor' => 'decimal:2',让Laravel自动处理精度转换。
二、MariaDB设置小数位为2的方法
直接将字段定义为DECIMAL类型并指定小数位即可,DECIMAL是精确数值类型,不会出现浮点数精度问题:
1. 创建表时配置
CREATE TABLE your_table ( -- 其他字段... settlement_factor DECIMAL(10, 2) -- 10为总位数(整数位+小数位),2为小数位,可按需调整总位数 );
2. 修改已有表的字段
ALTER TABLE your_table MODIFY COLUMN settlement_factor DECIMAL(10, 2);
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

