函数:浮点数转字符串时的怪异现象

函数代码如下:
DELIMITER //

CREATE FUNCTION F_AUTO_DIGIT_CONV (

`i_num` DECIMAL(30,6),

`i_point` int

) RETURNS VARCHAR(50)

BEGIN

DECLARE v_colname VARCHAR(50);



-- 处理输入为 NULL 的情况

IF i_num IS NULL THEN

    RETURN NULL;

END IF;

-- 根据数值大小自动转换单位

SET v_colname = (CASE

    WHEN i_num <= -100000000 THEN

        CONCAT(CAST(truncate(i_num / 100000000, i_point) AS CHAR), '亿')

    WHEN i_num > -100000000 AND i_num <= -10000 THEN

        CONCAT(CAST(truncate(i_num / 10000, i_point) AS CHAR), '万')

    WHEN i_num > -10000 AND i_num < 10000 THEN

        CAST(truncate(i_num, i_point) AS CHAR)

    WHEN i_num >= 10000 AND i_num < 100000000 THEN

        CONCAT(CAST(truncate(i_num / 10000, i_point) AS CHAR), '万')

    WHEN i_num >= 100000000 THEN

        CONCAT(CAST(truncate(i_num / 100000000, i_point) AS CHAR), '亿元') -- 修正拼写错误

    ELSE

        CAST(ROUND(i_num, i_point) AS CHAR)

END);

-- 处理前导点或负点的情况(如 ".5" -> "0.5" / "-.5" -> "-0.5")

RETURN (CASE

    WHEN v_colname LIKE '.%' THEN CONCAT('0', v_colname)

    WHEN v_colname LIKE '-.%' THEN REPLACE(v_colname, '-.', '-0.')

    ELSE v_colname

END);

END//

DELIMITER ;

–结果对比如下(想要的是第2种结果,但函数返回错了)-----------------
–函数运行
select F_AUTO_DIGIT_CONV(122046010.4900,2)
结果:1.2200000000亿元
–直接查询
select CONCAT(CAST(truncate(122046010.4900 / 100000000, 2) AS CHAR), ‘亿元’)
结果:1.22亿元

1 个赞

ob版本是多少

看着是i_point这个参数有问题 你试一下不用i_point这个参数 直接写成一个数字 CONCAT(CAST(truncate(i_num / 100000000, 2) AS CHAR), ‘亿元’)试一下

这个是我测试的结果

1 个赞

V4.3.5社区版

是的,你直接写死2是可以的,但这个小位数的控制我需要通过I_POINT传进来,不可能写死的

打卡学习 :+1:

保持和mysql一致 mysql也是这样 你可以测试一下 符合预期