MYSQL的decimal是一种精准数据类型,一般用于存放货币类型。但是如果你再PHP中没有进行正确的处理,还是会出现精度问题,出错示例如下:
echo floor((0.1 + 0.7) * 10);
上面的代码返回的是“7”,和想象中不一样,如果把这个数据存到MYSQL,即使字段设置的是decimal,最后实际上也是会出现误差,为什么会出现这个问题,这里不详细解释,大家可以自行百度。
下面重点解释如何解决这个误差问题:
方案一:
安装PHP的decimal扩展,需要PHP版本 >7.2
安装方法和手册请查看:
http://php-decimal.io/#basic-usage
简单使用方法:
use Decimal\Decimal;
$a = new Decimal("1", 2);
$b = new Decimal("7", 8);
print_r($a / $b);
方案二:
使用PHP内置函数:
bcadd — 将两个高精度数字相加
bccomp — 比较两个高精度数字,返回-1, 0, 1
bcdiv — 将两个高精度数字相除
bcmod — 求高精度数字余数
bcmul — 将两个高精度数字相乘
bcpow — 求高精度数字乘方
bcpowmod — 求高精度数字乘方求模,数论里非常常用
bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”
bcsqrt — 求高精度数字平方根
bcsub — 将两个高精度数字相减
简单使用方法:
floor(bcadd($a, $b, 2) * 10) //可以看出成功返回想要的数字8
使用那种方法,看自己的是实际情况来决定。
RoveCoder版权所有,转载请注明