首页 > 后端 > 正文

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版权所有,转载请注明

猜你喜欢
picture loss