gpt4 book ai didi

php - 在 Mysql 或 PHP 中处理小数精度

转载 作者:行者123 更新时间:2023-11-29 02:03:02 25 4
gpt4 key购买 nike


我有一个 MySQL 表,即 estimate_item,其中包含几列,这些列以固定精度保存十进制值。这是我的表结构。

表名: estimate_item

enter image description here

在使用 PHP 检索记录时,我使用 MySQL 的函数进行一些基本计算,我使用的 SQL 查询是这样的。

SELECT 
COUNT(ei.item_id) as total_item,
SUM(ei.quantity) as total_quantity,
SUM(ei.number_of_carton) as total_carton,
SUM(ei.number_of_carton * ei.cbm_per_carton) as total_cbm,
SUM(ei.quantity * ei.cost) as total_cost,
SUM(ei.quantity * ei.rate) as total_rate,
e.commission_amount,
SUM(ei.quantity * ei.rate) + e.commission_amount as total_amount
FROM
ai_estimate e
LEFT JOIN
ai_estimate_item ei ON ei.estimate_id = e.id
WHERE
ei.estimate_id = ?

例如上面的查询返回结果。

+------------+----------------+--------------+-----------+------------+------------+-------------------+--------------+
| total_item | total_quantity | total_carton | total_cbm | total_cost | total_rate | commission_amount | total_amount |
+------------+----------------+--------------+-----------+------------+------------+-------------------+--------------+
| 2 | 120 | 807 | 1122.6440 | 2.7500 | 137.5000 | 1500.00 | 1637.5000 |
+------------+----------------+--------------+-----------+------------+------------+-------------------+--------------+

由于以下列包含 4 个精度值 total_cbm_total、total_cost、total_rate、total_amount,我想用这种方式对所有四列的值进行四舍五入。

a) 如果值为 1122.6440,则将其四舍五入为 1122.644

b) 如果值为 2.7500,则将其四舍五入为 2.75

c) 如果值为 137.5000,则将其四舍五入为 137.50

d) 如果值为 1200.0000,则将其四舍五入为 1200.00

即我希望这些值至少包含两个精度,根据值的不同,它可以达到 3 或 4 个精度。

有什么方法可以直接在 MySQL 中执行此操作?还是 PHP 方式?

感谢和问候。

最佳答案

如果您在 MySQL 中这样做,我猜您需要添加一个 CASE WHEN...END 来使查询过于复杂。

所以我会用 PHP 来做。

function reprecise($value)
{
$two_digit = number_format($value, 2);
$three_digit = number_format($value, 3);
return (float)$two_digit == (float)$three_digit ? $two_digit : $three_digit;
}

这使用了一个技巧 - 首先它计算两位数和三位数字的表示,然后检查它们是否是相同的 float 。如果是,则三位数版本的最后一位必须为零,而使用两位数版本。

要扩展到 2、3 或 4 位数字,您可以在一个循环中执行此操作:

function reprecise($value)
{
$digits = 4;
for ($rep = number_format($value, $digits--); $digits >= 2; $digits--)
{
$new = number_format($value, $digits);
if ($new != $rep)
break;
$rep = $new;
}
return $rep;
}

或者,由于字符串函数很可能比 number_format 更快:

function reprecise($value)
{
$digits = 9;
$base = strrev(number_format($value, $digits));
for ($i = 0; $i < $digits-2; $i++)
if ($base[$i] != '0')
break;
return strrev(substr($base, $i));
}

关于php - 在 Mysql 或 PHP 中处理小数精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11584086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com