接过微信支付的都知道,微信支付需要把单位为元的金额转成单位分再带入接口,于是,有些人会这样写:

$totalFee = intval($money * 100);

金额变量 $money 只精确到小数点后2位,在 mysql 中一般用 decimal(8,2) 类型存储。假设金额为9.70元 ,由于计算 $totalFee 用的是乘法,不像除法可能除不尽,所有你可能认为 $totalFee 的结果就是整数 970。但实际上,当你加上 var_dump 打印的时候,会有意想不到的结果:

$money = '9.70';
$totalFee = intval($money * 100);

var_dump($totalFee);
//打印:int(969)

打印结果居然是 int(969),是不是感到很意外?将代码改动一下,加入变量 $temp,再来观察下:

$money = '9.70';
$temp = $money * 100;
$totalFee = intval($temp);

var_dump($temp);
//打印:float(969.9999999999999)

var_dump($totalFee);
//打印:int(969)

变量 $temp 是一个浮点数 float(969.9999999999999),出现这样的结果,是因为 PHP 在计算这个乘法的时候,会先把金额 '9.70' 转换成浮点数,再去乘以 100,得到的结果自然也是浮点数,而 intval 函数只截取整数部分,所以 $totalFeeint(969)。但如果金额 $money 的小数部分全是0的话,就不会存在这种问题,要特别小心掉入这个陷阱,这并不是 PHP 语言的 BUG。

综上,金额的计算还是乖乖使用 BCMath 函数吧:

$totalFee = intval(bcmul($money, '100', 0));