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

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

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

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

10520 次点击
所在节点    程序员
76 条回复
PopRain
2020-06-20 12:30:42 +08:00
@mitu9527 用整数也有问题,小数点的位置问题,常用货币 1 JPY=0.009357 USD,还有一些以亿元为单位的货币
DOLLOR
2020-06-20 13:15:06 +08:00
@xuanbg
当然可以。不仅四则,乘方、开方、对数、三角函数都可以。
最简单的方法,模拟人类手工笔算一样操作每一位数就好了。只要资源足够,理论上没有精度上下限。
Building
2020-06-20 13:24:41 +08:00
@xuanbg String 不能做四则运算......按你这个意思你是不是觉得计算机只要超过 UIntMax 的整数就没办法表示了?
rapiz
2020-06-20 14:00:05 +08:00
一帖显示出 v2 上有多少人基本功不过关
hantsy
2020-06-20 14:13:22 +08:00
用 Java 的话,有 Java Money 标准(JSR354),和 Java DateTime 一个时期的产品,可惜一直没进 JDK 。
但是这个项目已经很成熟,https://javamoney.github.io/ ,官方提供了 JPA 扩展,也就是说直接用关系数据库没问题的。
@cigarzh
@xuanbg

遇到金融数据,自然想到 BigDecimal 当然是最基本的常识。但是 Money 还包括了相应 Currency 的处理,特别是国际化方面。
mitu9527
2020-06-20 15:04:57 +08:00
@PopRain 从数学角度看,不管你怎么处理总会存在误差,1/3 永远都除不尽,总是在某个位置要截断。我们要做的是把问题解决到可接受范围内,而不是完美解决。所以靠长整型和 Money 模式可以解决绝大多数问题,性能也还不错;如果业务真的要处理津巴布韦这种货币了,用 GMP,支持任意长度的整型,本质上是字符串,就是性能差。
PopRain
2020-06-20 15:15:21 +08:00
@mitu9527 我是支持用 Decimal 的,基本在业务范围内的问题都可以解决,而整数很多需要自己处理,遇到某些不熟悉的程序员,可能出现大问题,譬如上面说的 1 元=100
xuanbg
2020-06-20 15:50:35 +08:00
@mitu9527
@hantsy
@Building 你们啊,用第三库或者自己造个轮子让 string 能够进行计算我会不懂? BigDecimal 本身也是一个轮子,内部的实现还是 int 和 long 。

难道你们还能造个不用 int 、long 、double 、float 的轮子不成?
yuzo555
2020-06-20 16:06:17 +08:00
没研究,但是如果强行用 double 的话,我感觉,除了:

1.误差好像基本上都是小于 10^-7 级别 (0.0000001) 的误差,每次计算完后都按照要求精度 round 一下应该可以解决这个问题;
2.比较相等 == 的时候需要额外处理下。

还有哪些需要注意的吗。
mitu9527
2020-06-20 16:23:33 +08:00
@xuanbg 原谅 PHP 太 low,没有 BigDecimal,只能用 GMP 或者 BC Math 扩展。然后最懒的方式就是用现成的、实现 Money 模式的库,还可以搞定币种、最小金额单位和分配等问题。
everhythm
2020-06-20 16:26:23 +08:00
用 int,不同币种可以指定价格等级,类似 appstore

不然等着被疯狂薅 1 分钱羊毛
cubecube
2020-06-20 16:30:10 +08:00
@3dwelcome 其实我原来在银行的时候,非核心的外部系统,C 开发的,double 用来处理也没啥问题。基本上有效位数是够的。
chenuu
2020-06-20 17:53:25 +08:00
Long,经过我们系统的大概千亿级
zhuweiyou
2020-06-20 19:35:40 +08:00
运算还是存储,存储的话,什么都行。涉及运算要么用大数类,要么单位分 整数运算。
Vegetable
2020-06-20 19:40:08 +08:00
好奇为什么 Decimal 不是标准答案
celeron533
2020-06-20 19:44:17 +08:00
decimal
sxd96
2020-06-20 19:52:08 +08:00
不知道楼上在喷什么,人家说用 double 存储,存储有问题吗?计算的时候拿出来怎么样精确计算各有各的方法,谁都知道 double 直接算会出问题。
devinww
2020-06-20 19:59:11 +08:00
BigDecimal
xuanbg
2020-06-20 20:02:25 +08:00
@sxd96 当然有问题,因为 double 的 1 不等于 int 的 1 啊
sagaxu
2020-06-20 20:04:28 +08:00
int string 或者 double 都行,只要处理得当。但是最后你会发现,你重新发明了 decimal 的轮子

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

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

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

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

© 2021 V2EX