【发布时间】:2020-03-12 05:57:01
【问题描述】:
当我尝试使用 PHP 函数补货时遇到一个非常奇怪的问题。
函数如下:
function add_stock($products_id, $add_quantity) {
global $db;
$db->Execute("update " . TABLE_PRODUCTS . "
set products_quantity = products_quantity + " . (int)$add_quantity . ", products_ordered = products_ordered - " . (int)$add_quantity . " where products_id = '" . (int)$products_id . "'");
}
所以,在上述函数中,我关注的区域是products_quantity 添加到$add_quantity 时。
一切正常,但是当我测试一个数量为 1 000 000 或更多的产品时,它会进行奇怪的计算。
例如,测试产品的数量为 1 000 000。使用该函数添加 8 使其成为 1 000 010。因此,它不是添加 8,而是添加了 10。我使用 6 和 8 再次运行它,结果为1 000 020 然后是 1 000 0030。就像 10 的增量一样。我很困惑。
我在其他十几种数量低于一百万的产品上进行了尝试,每次都完美无瑕。
编辑:通过 cmets 询问后 - products_quantity 的数据类型为 FLOAT。
【问题讨论】:
-
products_quantity的数据类型是什么? -
如果你使用准备好的语句而不是连接变量会更好。
-
我假设您使用的是 FIXED PRECISION 数据类型,而不是浮点数,对吧?也就是说,使用以下之一:DECIMAL、NUMERIC、INT、BIGINT。
-
你减去的
products_ordered有什么作用? -
FLOAT 精度低,需要四舍五入。那就是问题所在。将数据类型更改为我提到的一种。