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中安装。