Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于金额字段为什么不用decimal类型? #26

Open
panda-men opened this issue Jun 5, 2020 · 4 comments
Open

关于金额字段为什么不用decimal类型? #26

panda-men opened this issue Jun 5, 2020 · 4 comments

Comments

@panda-men
Copy link

我看看了你那个支付流水表
金额是用2个字段来储存的,为什么不用decimal来储存?
total_fee INT UNSIGNED NOT NULL DEFAULT 0 COMMENT '支付金额,整数方式保存',
scale TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '金额对应的小数位数',
请问这样有什么好处或者问题?

@jmluang
Copy link

jmluang commented Jun 5, 2020

#16 貌似说过了,为什么不用 decimal 我也想知道

@panda-men
Copy link
Author

是不是为储存和更高精度的计算?

@bluntdel
Copy link

我觉得还是为了计算方便吧,即使数据库存储是decimal的,应用中处理浮点数也是比较头疼的。
存整数进行计算的话,计算完再除以精度是比较方便的。
但是我觉得有个问题是精度如果发生变化,难道要去更新所有数据吗。会有更好的方法吗?
以及如果涉及金额的字段比较多,是不是要多维护很多个scale字段呢。

@helei112g
Copy link
Member

helei112g commented Jun 22, 2020

主要两个原因:

  1. 避免不同语言对浮点数麻烦的计算,一不小心非常容易算错
  2. 对于多个国家,对小数的精度要求是不同的,用 decimal 没办法方便控制

对于 @bluntdel 说的精度变化,是指比如中国现在精度是2位小数,某天变成3位了吗?
首先如果是这样,我没有真的遇到过,而且就国家的金融体系来说,这种变化概率很低。不过确实有更好的方案,将精度字段不写如表中,表中只写币种,然后币种配置精度。
可以达成精度变更多出修改的问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants