首页 > 解决方案 > 将所有数字四舍五入,但保留总和

问题描述

假设我有 4 条记录如下:

CASH    
========    
1993.772
5015.572
996.884
1993.772

这些数字加起来10000.00。现在我想将所有这些数字四舍五入到小数点后两位,但总和保持为10000.00.

在上面的例子中,如果我删除最后一个数字,数字的总和将是9999.99而不是10000.00,但这样的东西仍然会加起来10000.00

CASH    
========    
1993.78   <- changed from 1993.77 to 1993.78
5015.57
996.88
1993.77

有什么简单的方法吗?

标签: sqlpostgresql

解决方案


这是具有挑战性的。这是一种方法:

select t.*,
       round(cash, 2),
       (case when row_number() over (order by cash desc) = 1
             then sum(cash) over () - sum(round(cash, 2)) over (order by cash rows between unbounded preceding and 1 preceding)
             else round(cash, 2)
        end)
from t;

是一个 db<>fiddle。

基本上,这会将所有值四舍五入到小数点后两位,除了最大的一位。对于那个,它从总数中减去舍入值的总和。

注意:这会将额外的值添加到最大值。它可以舍入最小值,但我认为舍入最大值更安全(对值进行较小的增量更改)。如果您有其他列来指定排序,则可以选择“第一”或“最后”列。


推荐阅读