微信支付上遇见少一分钱的问题,但是支付宝没有此问题,查找之后,确定问题出在微信价格单位按分算,支付宝是按元计算,
因为数据库使用decimal 保留两位小数,这和支付宝一致,在微信支付时取出数据库保存的价格*100再转int ,问题就出在这里,float转int精度损失。
知道问题所在就好办了。
解决方法有两种:
1. 利用四舍五入:
2.利用php bc数学函数库:
因为数据库使用decimal 保留两位小数,这和支付宝一致,在微信支付时取出数据库保存的价格*100再转int ,问题就出在这里,float转int精度损失。
[root@yunduanlocal api]# php -r "var_dump((int)(18.90*100));"
int(1889)
知道问题所在就好办了。
解决方法有两种:
1. 利用四舍五入:
[root@yunduanlocal api]# php -r "var_dump((int)(18.90*100 + 0.5));"
int(1890)
下面例子可以说明php float转int
echo '<pre>';
$a=0.11;
$b=(int)$a; //$b=0;
echo $b.'<br>';
$a=0.99;
$b=(int)$a; //$b=0;
echo $b.'<br>';
$a=1.11;
$b=(int)$a; //$b=1;
echo $b.'<br>';
$a=1.99;
$b=(int)$a; //$b=1;
echo $b.'<br>';
2.利用php bc数学函数库:
[root@yunduanlocal api]# php -r "var_dump((int)bcmul(18.90, 100));"
int(1890)
[root@yunduanlocal api]# php -r "var_dump((int)bcmul('18.90', '100'));"
int(1890)
bc函数库文档:http://php.net/manual/zh/ref.bc.php