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分钱,我只是演示数据,实际可能会更多,这个要怎么处理呢?
向下取整?还是有什么更好的方案

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 34

这是业务逻辑问题吧??

1年前 评论
wongvio (楼主) 1年前
Corplay (作者) 1年前

有点奇怪

  • 要么显示的时候,显示约等于
  • 要么存的时候,保存为 2 位
  • 要么显示的时候,显示 9 位
1年前 评论
wongvio (楼主) 1年前

sql返回的sum应该就是保留到几位就是几位啊。你的意思是前端展示的时候由于四舍五入保留到分导致的误差?

1年前 评论
wongvio (楼主) 1年前

9位。不是虚拟币吧 :smirk:

1年前 评论
小李世界 1年前
小木 1年前
wongvio (楼主) 1年前

简单的办法是再加一个字段保存金额,decimal(10,2)类似这样的只有两位小数。 然后输出时,该用哪个字段就用哪个字段。 最灵活。

1年前 评论
wongvio (楼主) 1年前

用下面这种查询方式,将查询出来的字段定为DECIMAL 类型,这里要注意如果数据库原来存储的数据不是DECIMAL 格式需要洗一次数据,floor和double都不适合存储金额类的,如果原有数据不是DECIMAL 各式记得清洗一遍
SELECT
SUM(CAST(money AS DECIMAL (12, 9))) AS money
FROM
test ;

file

1年前 评论
lgbxhr (作者) 1年前
wongvio (楼主) 1年前

为啥显示的时候,是拿四舍五入之后的数相加?不应该加完再四舍五入?

1年前 评论
wongvio (楼主) 1年前

实际上金额小数只到后两位有值,即便有9位也都是0

1年前 评论
wongvio (楼主) 1年前
sharejia (作者) 1年前

sum(round(money, 2))不就可以了 :flushed:

1年前 评论
wongvio (楼主) 1年前

转成int 类型存储(比如存分这种),不会丢失精度吧?

1年前 评论
wongvio (楼主) 1年前
keyboby (作者) 1年前
wongvio (楼主) 1年前
keyboby (作者) 1年前

bcadd 精度计算试下

file

file

1年前 评论
wongvio (楼主) 1年前

这跟精度有什么关系,你自己系统逻辑混乱而已。

从你演示的角度,我只看到了你想要sum后的四舍五入,但是你显示的时候,分别给求和前的数值进行四舍五入进行显示。你需要的是顺理逻辑

1年前 评论
wongvio (楼主) 1年前

存的时候✖️ 100000000(看情况加0)

取的时候使用 bcadd

1年前 评论
wongvio (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!