PHP:字符串自动转换为float并给出负数

时间:2018-06-09 03:25:42

标签: php

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

var_dump result of $balance

我试图检查数量是否导致问题,并尝试var_dump数量。在使用var_dump检查后,它显示我的数量的数据类型是字符串,而我的余额数量是浮动

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

    $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 />';

这是输出:

output shows negative balance

如何获得实际余额?

3 个答案:

答案 0 :(得分:2)

计算0.42 - 0.420000000000000000004时收到错误结果的原因是floating point precision错误。这是由于浮点数的存储方式,如果不正确,MySQL和PHP都容易出现浮点错误,但是当你需要高度精确的计算时,它们都有办法防止它们。对于浮点类型only the approximate value is stored并尝试将它们视为比较中的精确值可能会导致问题。

对于PHP,这意味着您需要使用the arbitrary precision math functionsgmp functions。对于MySQL,您需要使用DECIMAL格式存储数字,并使用所需的精度。

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

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

答案 1 :(得分:0)

使用number_format

$rr_quantity = number_format($row['quantity'], 2);

答案 2 :(得分:0)

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