php 比较浮点数-相同的数字,但不等于?[重复]

t40tm48m  于 2023-03-11  发布在  PHP
关注(0)|答案(3)|浏览(140)

此问题在此处已有答案

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)

非常非常令人沮丧。是什么导致的呢?

5f0d552i

5f0d552i1#

浮点数有有限的精度.查看警告关于比较他们在这里:
http://php.net/manual/en/language.types.float.php

l3zydbqr

l3zydbqr2#

浮点数不是100%准确的!你在PHP中的计算可能返回10.00000000001,它不等于10。
在比较浮点数之前,使用sprintf(http://php.net/manual/en/function.sprintf.php)格式化浮点数。

sbdsn5lh

sbdsn5lh3#

使用number_format代替乘1。

$carttotal = number_format((int)$carttotal,2,'.','');
 $_REQUEST['amount'] = number_format((int)$_REQUEST['amount'],2,'.','');

相关问题