导读:MYSQL的decimal用于精准存储货币数据,但在PHP中处理不当仍会导致精度问题。例如,`echo floor((0.1 + 0.7) * 10);`错误返回“7”。解决方案有两种:一是安装PHP的decimal扩展(需PHP>7.2),通过`use Decimal\Decimal;`创建高精度对象;二是使用内置BC系列函数如`bcadd`等进行高精度运算,如`floor(bcadd($a, $b, 2) * 10)`可正确返回8。具体选择依据实际需求
                
                
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使用那种方法,看自己的是实际情况来决定。
关键词: PHP MYSQL 字段 decimal 
         
  
  
  
  
  
  
                 
                 
                 
         苏公网安备 32111202000338号
                苏公网安备 32111202000338号