mysql如何处理sum的精度问题
我现在数据库里的小数点精度是精确到小数点以后9位的,但是这就会造成我用mysql的sum求和的时候出现精度问题,比如,有个用户有两条数据:
id | money
---|------
1 | 57.326935000
2 | 57.175243000
---------------
mysql sum = 114.502178,四舍五入就是114.50
但是如果在用户的列表里一条条显示,由于实际结算只需要结算到分,所以显示的时候也是分(四舍五入),就会显示成:
1 57.33
2 57.18
-----------
合计 114.51
这样就会多就算1分钱,我只是演示数据,实际可能会更多,这个要怎么处理呢?
向下取整?还是有什么更好的方案
这是业务逻辑问题吧??
有点奇怪
sql返回的sum应该就是保留到几位就是几位啊。你的意思是前端展示的时候由于四舍五入保留到分导致的误差?
9位。不是虚拟币吧 :smirk:
简单的办法是再加一个字段保存金额,decimal(10,2)类似这样的只有两位小数。 然后输出时,该用哪个字段就用哪个字段。 最灵活。
用下面这种查询方式,将查询出来的字段定为DECIMAL 类型,这里要注意如果数据库原来存储的数据不是DECIMAL 格式需要洗一次数据,floor和double都不适合存储金额类的,如果原有数据不是DECIMAL 各式记得清洗一遍
SELECT
SUM(CAST(money AS DECIMAL (12, 9))) AS money
FROM
test ;
为啥显示的时候,是拿四舍五入之后的数相加?不应该加完再四舍五入?
实际上金额小数只到后两位有值,即便有9位也都是0
sum(round(money, 2))不就可以了 :flushed:
转成int 类型存储(比如存分这种),不会丢失精度吧?
bcadd 精度计算试下
这跟精度有什么关系,你自己系统逻辑混乱而已。
从你演示的角度,我只看到了你想要sum后的四舍五入,但是你显示的时候,分别给求和前的数值进行四舍五入进行显示。你需要的是顺理逻辑
存的时候✖️ 100000000(看情况加0)
取的时候使用 bcadd