bigdecimal 四舍五入保留两位小数_MySql采坑之四舍五入Round函数

由于前几天做了一个店铺评分的功能,本来SQL就比较简单,取平均值,四舍五入保留1位小数,但是测试测出了一个BUG。2.25的平均值四舍五入居然出现了2.2的取值。下面我们详细说一下。

v2-d47b516ec29f11a220a65b18862c6842_b.jpg

1.先看看测试数据库,其实从这里有些人已经看出问题了,不过你知道为什么吗?下面我们添加几条数据。

v2-8b069abcf700aff79ce23112275a553a_b.jpg

2.我们写SQL 求一下平均值。

SELECT avg(part1),avg(part2) FROM test where name='zjw'

v2-cd4c24c3d110fbcc7ef618138d9021e7_b.jpg

3.然后我们在平均值,保留一位小数四舍五入。

v2-c62bf58401b41716b7137fb6c335852f_b.jpg

当时一下就懵逼了,为啥3.75四舍五入是正常的3.8,而2.25就是2.2呢?

然后我又试了一下:

v2-a8cc9447b0c59e9441debc826d2a6808_b.jpg

这样看的没毛病啊,到底哪里出问题了呢?

后来在网上查资料,查了好几个都是废话,其中有一篇遇到了和我一样的问题,并且找出了原因,其实是查看了官方文档的Round函数说明:

  • For exact-value numbers, ROUND() uses the “round half up” rule(对于精确的数值, ROUND 函数使用四舍五入)
  • 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 any fractional part is rounded to the nearest even integer. (对于近似值,则依赖于底层的C函数库,在很多系统中 ROUND 函数会使用“取最近的偶数”的规则)

这样就很明白了,在计算机的计算领域里,包括JAVA里的double,float都不算是精准的计算类型,所以Round的计算就默认的走了第二条规则。

其实在写店铺评分的时候,表是别人设计好的,也没有仔细看,后来出现了这个问题,我一看评分的字段类型是double,就感觉不是很对,因为咱知道在java里用double就有失精准的情况,所以一般都用bigdecimal进行精准计算,但是我很怀疑,MySQL也是这样吗?如果是这样那为什么呢?后来我又改了下类型在试了试。

v2-20ea7a0e5d9c9174de9240f36983acea_b.jpg

我们把double改为decimal,在试一下sql

v2-7ff282c65a18f296ba93195cb2473826_b.jpg

完美,原因也找到了,解决方案也找到了,不过楼主的那个没法改类型了,临上线几天了,没法评估改动的影响,就只取的平均值,然后在JAVA转化为bigdecimal进行的四舍五入。

踩过的坑,献给各位遇到此问题的小伙伴们!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值