今天业务需求,需要将某个数字格式的数据使用四舍五入五留双的方式保留小数。考虑到使用sql实现比较复杂,所以还是使用自定义函数的方式实现。
输入一个数字格式,输入保留几位小数,做到round的功能,实现的代码如下。
CREATE OR REPLACE FUNCTION fuel_data.bk_round(value NUMERIC, decimal_places INT) RETURNS NUMERIC AS $$
DECLARE
scale_factor NUMERIC;
scaled_value NUMERIC;
remainder NUMERIC;
integer_part NUMERIC;
BEGIN
-- 放大到目标小数位
scale_factor := POWER(10, decimal_places);
scaled_value := value * scale_factor;
-- 提取整数部分和小数部分
integer_part := FLOOR(scaled_value); -- 整数部分
remainder := scaled_value - integer_part; -- 小数部分
-- 处理尾数小于 0.5 的情况:直接舍去
IF remainder < 0.5 THEN
RETURN integer_part / scale_factor;
-- 处理尾数大于 0.5 的情况:直接进位
ELSIF remainder > 0.5 THEN
RETURN (integer_part + 1) / scale_factor;
-- 处理尾数等于 0.5 的情况
ELSE
IF MOD(integer_part, 2) = 0 THEN
-- 如果整数部分是偶数,则舍去
RETURN integer_part / scale_factor;
ELSE
-- 如果整数部分是奇数,则进位
RETURN (integer_part + 1) / scale_factor;
END IF;
END IF;
END;
$$ LANGUAGE plpgsql IMMUTABLE;
