mysql-自定义函数传入的数字四舍五入总是有问题,原因是传入的数字不可以是int或者float类型,需要改成decimal类型

前段时间在遇到一个四舍五入的问题,已经解决写个博客记录一下,先看代码:

create  function `test`(v_num float) returns int
begin

if  v_num = 0
	  then return 0;
	elseif ceil(v_num)=1
	  then return 1;
	elseif ceil(v_num)>1
	  then return round(v_num);
	else return -1;
end if;

end

这一段代码中要是传入一个浮点型,返回一个int类型看,如果这个浮点型=0,则返回一个0,如果这个浮点型向上取整等于1,则返回1,如果这个浮点型向上取整大于1,则对他进行四舍五入的操作,其他情况返回-1。

注意一下这个时候这个函数实际上是由问题的,如下图:

 我传入的是22622.5,正常来说应该返回22623,但是却返回了22622,但是当我传入22622.6时,如下图:

 这个时候他又正常了,导致这个问题的根本原因是不可以传入float和int,传入的参数如果是数字类型那么只能是decimal类型,当我把传入的参数改为decimal时,如下图:

这个问题就解决了

 

MySQL中,可以通过自定义函数的方式实现“四舍六入五成双”的舍入规则。具体实现步骤如下: 1. 创建一个新的函数,命名为“ROUND_HALF_EVEN”。 ``` CREATE FUNCTION ROUND_HALF_EVEN(X DECIMAL(18,9), D INT) RETURNS DECIMAL(18,9) ``` 其中,X为要进行舍入的数值,D为要保留的小数位数。 2. 在函数中使用IF语句实现“四舍六入五成双”的舍入规则。 ``` IF((X * 10^D - ROUND(X * 10^D)) = 0.5 AND ROUND(ROUND(X * 10^(D+1)),-1) % 2 = 0, ROUND(X, D), ROUND(X + IF((X * 10^D - ROUND(X * 10^D)) >= 0.5, 0.5, -0.5), D)) ``` 其中,IF语句的判断条件与上文中的语句相同,如果需要进行“四舍六入五成双”,则返回ROUND(X, D),否则返回ROUND(X + IF((X * 10^D - ROUND(X * 10^D)) >= 0.5, 0.5, -0.5), D)。 3. 完整的函数代码如下: ``` CREATE FUNCTION ROUND_HALF_EVEN(X DECIMAL(18,9), D INT) RETURNS DECIMAL(18,9) BEGIN RETURN IF((X * 10^D - ROUND(X * 10^D)) = 0.5 AND ROUND(ROUND(X * 10^(D+1)),-1) % 2 = 0, ROUND(X, D), ROUND(X + IF((X * 10^D - ROUND(X * 10^D)) >= 0.5, 0.5, -0.5), D)); END; ``` 4. 使用该函数进行舍入操作: ``` SELECT ROUND_HALF_EVEN(3.245, 2); -- 返回 3.24 SELECT ROUND_HALF_EVEN(3.255, 2); -- 返回 3.26 SELECT ROUND_HALF_EVEN(3.25, 1); -- 返回 3.2 SELECT ROUND_HALF_EVEN(3.5, 0); -- 返回 4 SELECT ROUND_HALF_EVEN(4.5, 0); -- 返回 4 ``` 注意,该函数最大支持小数点第9位,如果需要支持更多位数,需要修改函数中DECIMAL类型的精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值