- 本文地址: https://www.yangdx.com/2023/04/238.html
- 转载请注明出处
接过微信支付的都知道,微信支付需要把单位为元的金额转成单位分再带入接口,于是,有些人会这样写:
$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
函数只截取整数部分,所以 $totalFee
是 int(969)
。但如果金额 $money
的小数部分全是0的话,就不会存在这种问题,要特别小心掉入这个陷阱,这并不是 PHP 语言的 BUG。
综上,金额的计算还是乖乖使用 BCMath 函数吧:
$totalFee = intval(bcmul($money, '100', 0));
快来评论一下吧!
发表评论