我有一个PHP代码可以计算数量的余额,但它给出了一个负值作为余额数量,如下图所示。
我试图检查数量是否导致问题,并尝试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 />';
这是输出:
如何获得实际余额?
答案 0 :(得分:2)
计算0.42 - 0.420000000000000000004
时收到错误结果的原因是floating point precision错误。这是由于浮点数的存储方式,如果不正确,MySQL和PHP都容易出现浮点错误,但是当你需要高度精确的计算时,它们都有办法防止它们。对于浮点类型only the approximate value is stored并尝试将它们视为比较中的精确值可能会导致问题。
对于PHP,这意味着您需要使用the arbitrary precision math functions或gmp functions。对于MySQL,您需要使用DECIMAL
格式存储数字,并使用所需的精度。
首先,您需要将MySQL中列的数据类型更改为DECIMAL
,而不是字符串。字符串不适合存储数字。即使您使用FLOAT
或DOUBLE
来存储您的值
你的代码实际上可能有效,因为这些值可能已经四舍五入。
接下来,看到值0.420000000000000000004
来自存储在数据库中的字符串,我假设错误源于您在计算要插入的值时事先使用PHP进行的任何计算。您需要更新此代码才能使用精确的数学运算。
答案 1 :(得分:0)
$rr_quantity = number_format($row['quantity'], 2);
答案 2 :(得分:0)
浮点变量范围1.7E-308和1.7E + 308,因此它给出了15位精度。使用数字格式