bigdecimal四舍五⼊保留两位⼩数_MySql采坑之四舍五⼊
Round函数
由于前⼏天做了⼀个店铺评分的功能,本来SQL就⽐较简单,取平均值,四舍五⼊保留1位⼩数,但是测试测出了⼀个BUG。2.25的平均值四舍五⼊居然出现了2.2的取值。下⾯我们详细说⼀下。
1.先看看测试数据库,其实从这⾥有些⼈已经看出问题了,不过你知道为什么吗?下⾯我们添加⼏条数据。
2.我们写SQL 求⼀下平均值。
SELECT avg(part1),avg(part2) FROM test where name='zjw'
3.然后我们在平均值,保留⼀位⼩数四舍五⼊。
当时⼀下就懵逼了,为啥3.75四舍五⼊是正常的3.8,⽽2.25就是2.2呢?
然后我⼜试了⼀下:
这样看的没⽑病啊,到底哪⾥出问题了呢?
后来在⽹上查资料,查了好⼏个都是废话,其中有⼀篇遇到了和我⼀样的问题,并且出了原因,其实是查看了官⽅⽂档的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也是这样吗?如果是这样那为什么呢?后来我⼜改了下类型在试了试。
我们把double改为decimal,在试⼀下sql
完美,原因也到了,解决⽅案也到了,不过楼主的那个没法改类型了,临上线⼏天了,没法评估改动的影响,就只取的平均值,然后在JAVA转化为bigdecimal进⾏的四舍五⼊。
踩过的坑,献给各位遇到此问题的⼩伙伴们!
>bigdecimal除法保留小数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。