MySQL使用 round()函数,小数点 5 不进位的情况分析

今天测试代码数据的时候,发现一个问题,就是 1.125--> 使用round() 函数取2位小数点额时候,结果是1.12而不是预期结果1.13.

-- 背景大概就是:从一个参数表里面取一个参数进行运算,结果要四舍五入保留两位小数。

-- 参数表的字段属性为 varchar

select test_round into @v_value from t_test_rowid where a = 1;
select round((10.5-@v_value)/2, 2)  as new_value

 出现该问题的原因,与参数类型有关。

①仅当参与运算的所有参数的参数类型是“数值”类型的,运算结果才是“数值”,round() 采用“四舍五入”的原则求得最后的结果。

②当有字符串类型的数据参与运算时,得到的结果是“字符串”类型的,结果使用round()函数采用“四舍六入五成双”的原则求得最终的结果。

解决方案:

可以将字符串类型的数据转换成数字类型的参数。

cast('1.125' as decimal(18,2))

 

关于以上两点可以参考以下2个连接:

链接一《关于MySQL的ROUND函数四舍五入的细节分析_BlueEyesHolder的博客-CSDN博客

引子
在群里,有人问了这么一个问题,引起了我的兴趣。查询之后感觉打开了新世界的大门,因此记录一下,以作备忘(MySQL版本:5.7.17-log)。

#执行:
SELECT ROUND(1.3225, 3);
#结果:
1.323
#执行:
SELECT ROUND('1.3225', 3);
#结果:
1.322

MySQL的ROUND()函数:
ROUND(X)或ROUND(X,D),简单来说作用是返回X四舍五入到小数点后第D位(默认0)的值,即:

#执行:
SELECT ROUND(-1.23);
#结果:
-1
#执行:
SELECT ROUND(1.298, 1);
#结果:
1.3

回到上面的问题,为什么看似相同的语句执行出来的结果不同,其实可以从官方文档[1]中找到端倪(以下是我自己的翻译,如果有误谢谢指出):

ROUND() uses the following rules depending on the type of the first argument:

ROUND()根据第一个参数的类型来应用以下(不同)的规则:

For exact-value numbers, ROUND() uses the “round half away from zero”
or “round toward nearest” rule: A value with a fractional part of .5
or greater is rounded up to the next integer if positive or down to
the next integer if negative. (In other words, it is rounded away from
zero.) A value with a fractional part less than .5 is rounded down to
the next integer if positive or up to the next integer if negative.

对于精确值的数字,ROUND()使用”中间值朝远离0点方向舍入“或”朝最近舍入“规则:一个小数部分为.5或更大的值,若为正则向上舍入,若为负则向下舍入。(换而言之,就是向远离0的方向舍入。)一个小数部分小于.5的值,若为正则向下舍入,若为负则向上舍入。

For approximate-value numbers, the result depends on the C library. On
many systems, this means that ROUND() uses the “round to nearest even”
rule: A value with a fractional part exactly halfway between two
integers is rounded to the nearest even integer.

对于近似值的数字,返回结果取决于C库。在许多系统中,这意味着ROUND()使用”舍入最接近的偶数“规则:一个值的小数部分正好在两个整数中间时,舍入到最接近的偶数。

解答
根据以上规则,我们可以推断,MySQL自动将‘1.3225’这个字符串转换为了一个近似值数字。
那么,在MySQL中(仅针对MySQL 5.7),哪些数值型数据类型对应的是精确值的数字呢,以下就是答案:
1)整型:INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
2)定点型:DECIMAL, NUMERIC
值得注意的是,浮点型并不在列,这也就是为什么会出现开头问题的原因。
————————————————
版权声明:本文为CSDN博主「BlueEyesHolder」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/BlueEyesHolder/article/details/108426950

链接二《SQL中Round函数没有四舍五入原因及处理方法_round不四舍五入_独特的弧度的博客-CSDN博客》 

为什么我们在写sql使用round函数四舍五入时,明明后面是5可以进位反而舍掉了那?

原因在于“四舍六入五成双”原则(来源于百度百科)
对于位数很多的近似数,当有效位数确定后,其后面多余的数字应该舍去,只保留有效数字最末一位,这种修约(舍入)规则是“四舍六入五成双”,也即“4舍6入5凑偶”,这里“四”是指≤4 时舍去,"六"是指≥6时进上,"五"指的是根据5后面的数字来定,当5后有数时,舍5入1;当5后无有效数字时,需要分两种情况来讲:
(1)5前为奇数,舍5入1;
(2)5前为偶数,舍5不进(0是偶数)。

解决方案:
采用CAST函数,用于将某种数据类型的表达式显式转换为另一种数据类型。CAST()函数的参数是一个表达式,它包括用AS关键字分隔的源值和目标数据类型。

语法:CAST (expression AS data_type)
例如:SELECT CAST(‘11.115’ as decimal(3, 2))
decimal函数,这里的3是这个小数的位数有多少位, 一般最大不超过38位,当然直接写38也可以,
后面的参数中的2是小数点后取几位, 是2就取两位, 是3就取三位! 并且是四舍五入后的结果!
————————————————
版权声明:本文为CSDN博主「独特的弧度」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43674919/article/details/109776597

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL的ROUND函数用于对查询结果进行四舍五入。然而,有时候可能会出现该函数不起作用的情况。这可能是由于函数的参数不正确导致的。在引用中的示例中,参数为负数时,ROUND函数会按照绝对值最接近的整数进行四舍五入。所以,对于-0.358和-0.538,ROUND函数会返回0。这意味着负数的四舍五入结果可能不是你所期望的。在引用中的问题描述中也提到了这个问题。 另外,在引用中的示例中,第一个参数为456.538,第二个参数为负数。这里的负数表示要将第一个参数的小数点向左移动的位数。对于456.538和-2,ROUND函数会将小数点向左移动两位,然后进行四舍五入。所以,结果是456.54。同样地,对于456.538和-3,ROUND函数会将小数点向左移动三位,然后进行四舍五入。所以,结果是500。 综上所述,要正确使用MySQL的ROUND函数,需要确保参数的正确性,并注意负数参数的处理方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL函数ROUND](https://blog.csdn.net/weixin_42299140/article/details/113631673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [MySQL之ROUND函数四舍五入的陷阱](https://download.csdn.net/download/weixin_38724535/14833437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值