0

我有一个 PHP 代码可以计算数量的余额,但它给了我一个负值作为余额数量,如下图所示。

$balance 的 var_dump 结果

如果是什么导致了问题,我尝试检查数量并尝试 var_dump 数量。使用 var_dump 检查后,显示我的数量的数据类型是string而我的余额数量是float

到目前为止,我的代码如下:

    $query_po_quantity = mysqli_query($new_conn, "SELECT quantity, po_number FROM purchase_order WHERE supplier_name = '$supplier_name' AND category_name = '$category_name' AND activity = '$activity' AND description = '$description'");

    $row = mysqli_fetch_assoc($query_po_quantity);

    $po_quantity = $row['quantity'];
    $po_number = $row['po_number'];

    $query_rr_quantity = mysqli_query($new_conn, "SELECT SUM(total_received) AS quantity FROM receiving_reports WHERE po_number = '$po_number' AND category_name = '$category_name' AND activity = '$activity' AND description = '$description'");

    $row = mysqli_fetch_assoc($query_rr_quantity);
    $rr_quantity = $row['quantity'];

   $balance = $po_quantity - $rr_quantity;
   $supplier_name = preg_replace('/\\\\/', '', $supplier_name);


   echo $po_quantity.' - '.$rr_quantity.' = '.$balance.'<br />';

这是输出:

输出显示负余额

我怎样才能得到实际余额?

4

3 回答 3

2

计算时得到不正确结果的原因是浮点精度0.42 - 0.420000000000000000004错误。这是由于浮点数的存储方式,如果操作不正确,MySQL 和 PHP 都容易出现浮点错误,但是当您确实需要高精度计算时,它们也都有办法防止它们发生。对于浮点类型,仅存储近似值,并且在比较中尝试将它们视为精确值可能会导致问题。

对于 PHP,这意味着您需要使用任意精度的数学函数gmp 函数。对于 MySQL,您需要使用DECIMAL所需精度的格式存储数字。

首先,您需要将 MySQL 中列的数据类型更改为DECIMAL,而不是字符串。字符串不适合存储数字。即使您使用FLOATorDOUBLE来存储您的值,您的代码也可能确实有效,因为这些值可能会被四舍五入。

接下来,由于值0.420000000000000000004来自存储在数据库中的字符串,我假设错误源于您在计算要插入的值时事先使用 PHP 所做的任何计算。您将需要更新此代码以使用精确的数学。

于 2018-06-09T05:05:57.917 回答
0

使用number_format

$rr_quantity = number_format($row['quantity'], 2);
于 2018-06-09T03:44:12.523 回答
0

浮点变量范围 1.7E-308 和 1.7E+308 所以它给出了 15 位的精度。使用数字格式

于 2018-06-09T03:46:40.963 回答