此问题在此处已有答案:
How should I do floating point comparison?(12个答案)
php integer and float comparison mismatch(3个答案)
昨天关门了。
我有两个变量$_REQUEST['amount']
和$carttotal
,这两个变量是关于电子商务的,当然,在处理付款时,它们应该匹配,以防止在最后一刻手动覆盖付款金额,或者当然,计算错误。
然而:
$carttotal = $carttotal * 1;
$_REQUEST['amount'] = $_REQUEST['amount'] * 1;
if($carttotal != $_REQUEST['amount']) {
$code = 0; // cart empty under this user - cannot process payment!!!
$message = 'The cart total of ' . $carttotal . ' does not match ' . $_REQUEST['amount'] . '. Cannot process payment.';
$amount = $carttotal;
$json = array('code' => $code,
'message' => $message,
'amount' => $amount);
die(json_encode($json));
} else {
$trnOrderNumber = $client->id . '-' . $carttotal;
}
上面的代码,传递了相同的数字,没有给我相等的结果。基本上我得到的错误消息就好像$carttotal != $_REQUEST['amount']
是true
(不相等的变量)。
所以为了测试瓦斯,我溜了进去:
var_dump($_REQUEST['amount']);
var_dump($carttotal);
看看发生了什么(在我进行* 1
计算以确保它们作为浮点数而不是字符串处理之后)。
我拿回了这个:
float(168.57)
float(168.57)
非常非常令人沮丧。是什么导致的呢?
3条答案
按热度按时间5f0d552i1#
浮点数有有限的精度.查看警告关于比较他们在这里:
http://php.net/manual/en/language.types.float.php
l3zydbqr2#
浮点数不是100%准确的!你在PHP中的计算可能返回10.00000000001,它不等于10。
在比较浮点数之前,使用sprintf(http://php.net/manual/en/function.sprintf.php)格式化浮点数。
sbdsn5lh3#
使用number_format代替乘1。