涉及金钱存储或计算操作时,你们一般都使用什么数据类型

2020-06-19 20:57:16 +08:00
 einsdisp

直接使用小数类型进行计算或存储(编程语言的 float 类型及数据库的 decimal 类型)

还是乘以 100,以分为单位,使用整数类型进行计算及数据库存储?

10520 次点击
所在节点    程序员
76 条回复
xingheng
2020-06-19 23:44:29 +08:00
万万没想到,居然还有这么多人写的系统用浮点类型,惊到了
CEBBCAT
2020-06-20 00:00:28 +08:00
@3dwelcome #14 学完了 IEEE 754 再来回帖吧……
lxml
2020-06-20 01:48:04 +08:00
@3dwelcome #14 你在逗我????来电商三天包你下岗……
zjsxwc
2020-06-20 02:08:08 +08:00
@xuanbg #8 原文:“用 string 就更搞笑了,完全是治标不治本。”
回复:

我倒觉得如果不用 decimal 而用 ` 两位小数的 string `或者 `乘以 100 的 integer `,貌似也都可以,因为好像也不会碰到无脑 double 浮点数运算的误差问题。
xuanbg
2020-06-20 07:17:15 +08:00
@zjsxwc string 看上去是没有精度问题,但你总要计算的吧,转 double 计算吗?所以我说「治标不治本」
susunus
2020-06-20 07:59:26 +08:00
老实说目前用的就是 Double 存储的,计算的时候,用用 BigDecimal 包裹,处理了下精度问题,那位老哥帮忙科普下,这样有啥风险
Building
2020-06-20 08:06:20 +08:00
@xuanbg 人家都用 String 存储了你非要转 Double 做运算,不知道谁傻。
reself
2020-06-20 08:18:41 +08:00
@susunus 浮点数只能表示数轴上的离散点,计算结果只能近似到最近的点,除非刚好能用 2 进制表示,例如 0.5,否则都是近似值。数轴上的点数量是无穷的,用有穷的浮点数来做计算,有偏差的概非常大。所以浮点数只能用在能容忍偏差的场景,比如图形绘制。除了数值偏差,浮点数还有众所周知的不能用==判定相等的特性。
LukeEuler
2020-06-20 08:46:47 +08:00
小数字用 decimal,大数字用 string,bytes 之类的,自己设计运算方法。
存储的和传输内容都是整数,只有显示时用 string 形式的浮点数。
mitu9527
2020-06-20 08:58:10 +08:00
参考 Money 模式,底层一般用 64 位的整型就可以了;如果长整型还不够用,那就考虑 GMP 吧。
darrenfang
2020-06-20 09:16:56 +08:00
@3dwelcome #14 以前写的代码用 double,突然发现数据库里面存的数据变成了 100.00000009,哈哈哈哈哈
xuanbg
2020-06-20 09:43:54 +08:00
@Building string 能做四则运算???
des
2020-06-20 09:50:07 +08:00
@xuanbg 可以
rekulas
2020-06-20 10:04:56 +08:00
@xuanbg decimal 也是 string 按我了解的 多种语言的高精度计算貌似都用到了字符串做中间过程
des
2020-06-20 10:07:06 +08:00
并不需要转数值再计算,可以看一下这个 https://oi-wiki.org/math/bignum/
yadiman
2020-06-20 10:13:41 +08:00
某金融,13 位整形,minor unit,配合 decimal flag,然后转化成 major unit 。
比如,美金,decimal flag 就是 2,所以,100 minior unit = 1 USD major unit
越南盾,decima flag 就是 0,10000 minor unit 就是 10000 越南盾元。

通货膨胀,经常爆了。。。
PopRain
2020-06-20 10:38:31 +08:00
c# Decimal 值类型表示介于正 79,228,162,514,264,337,593,543,950,335 和负 79,228,162,514,264,337,593,543,950,335 之间的十进制数字。
sql server money -922,337,203,685,477.5808 到 922,337,203,685,477.5807 (对于 Informatica,为 -922,337,203,685,477.58 到 922,337,203,685,477.58 。Informatica 仅支持两位小数,而不是四位。)

我想不出来什么应用可以超出它的范围
PopRain
2020-06-20 10:40:49 +08:00
😓,楼上的通货膨胀没有考虑到,以百万为货币单位的货币是很容易爆。。。
mitu9527
2020-06-20 10:57:07 +08:00
@PopRain 64 位整型,最大可以支持 900 万万亿,算上通货膨胀,也基本够用。真要是超出这个那就上 GMP ?
U97F3
2020-06-20 11:01:07 +08:00
Numeric(19, 2)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/683167

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX