Php 比较浮点数-相同的数字,但不相等?
可能重复:Php 比较浮点数-相同的数字,但不相等?,php,floating-point,Php,Floating Point,可能重复: 我有两个变量,$\u REQUEST['amount']和$cartotal,用于电子商务。当然,在试图处理付款时,它们应该匹配,以防止在最后一分钟手动覆盖付款金额,或者当然,防止计算错误 然而: $carttotal = $carttotal * 1; $_REQUEST['amount'] = $_REQUEST['amount'] * 1; if($carttotal != $_REQUEST['amount']) { $code = 0; // cart emp
我有两个变量,
$\u REQUEST['amount']
和$cartotal
,用于电子商务。当然,在试图处理付款时,它们应该匹配,以防止在最后一分钟手动覆盖付款金额,或者当然,防止计算错误
然而:
$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;
}
上面的代码传递了相同的数字,但没有给我相同的值。基本上,我得到的错误消息就像$cartotal!=$_请求['amount']
为true
(变量不相等)
为了测试VAR,我偷偷溜进:
var_dump($_REQUEST['amount']);
var_dump($carttotal);
查看发生了什么(在我进行*1
计算以确保它们作为浮点而不是字符串处理之后)
我把这个拿回来了:
float(168.57)
float(168.57)
非常非常令人沮丧。这可能是什么原因造成的 浮点数不是100%准确! 您在PHP中的计算可能返回10.00000000001,该值不等于10
在比较浮动之前,请使用sprintf()格式化浮动。而不是乘以一个Use number\u格式
$carttotal = number_format((int)$carttotal,2,'.','');
$_REQUEST['amount'] = number_format((int)$_REQUEST['amount'],2,'.','');
浮点数的精度有限。在此处查看有关比较它们的警告:
我们又来了。请仔细阅读浮点以及为什么不能比较它们。在PHP中,如果您使用的是!=而不是!==变量类型应该不重要,因为它在进行比较时会规范化变量类型。对不起@jeffkee,这有点居高临下,我很抱歉。只是“为什么我的浮点数不相等”可能是这里最常被问到的重复问题。这是一个经常被问到的问题,因为它违背了普通的逻辑,以及计算机计算对每一个可能的数字都是精确的——这就是“人类”对数字和计算机逻辑的感知。现在我们有了另一个在谷歌上爬行的网页,上面会有更多相关的关键词,这样别人就有更高的机会找到它,而不必发帖。顺便说一句,我确实知道这一点,但是我认为当我使用vardump()时,它仍然会显示无穷多的小数,比如168.5699991233521,所以这是非常令人困惑的部分。实际上,这是varu dump和打印浮点数的问题。number_格式将从数字中生成一个字符串,从我的观点来看,不建议这样做,因此,您将金额转换为整数,因此小数点后的任何数字现在都被忽略
11.20
等于11.99
对于任何查看的人,请尝试。您可能需要在apache中安装。