准备开发和钱有关的功能,还有哪些地方要注意

2020-02-24 12:30:47 +08:00
 5bb864e1fc775087

已知钱精确到分

准备这样处理:

还有什么要注意的吗?

7344 次点击
所在节点    程序员
35 条回复
5bb864e1fc775087
2020-02-24 12:31:10 +08:00
如果预期后面金额会很大的话,字段类型是不是要用 long 型?而不是 int
5bb864e1fc775087
2020-02-24 12:31:20 +08:00
看到 [https://www.v2ex.com/t/569119?p=1#r_7407244]( https://www.v2ex.com/t/569119?p=1#r_7407244) 有人说存成分,遇到利率汇率会有问题?
opengps
2020-02-24 12:49:19 +08:00
用 int 不可取,有些时候要用小数的,比如 10 元 9 个需要求单价。
我接触过的话几次金额相关的都用了 4 小数位或者 6 小数位 decimal
lvsshuttao
2020-02-24 13:01:23 +08:00
楼上说得对,之前做银行项目,要保留 6 位小数,所以一般都用 decimal,我是用 decimal(20,6) ,decimal(16,2)
freakxx
2020-02-24 13:01:37 +08:00
- 用 decimal 避免精度问题;
- 用 ROUND_HALF_EVEN 来做处理,可搜下 银行家舍入法;
- 涉及汇率要谨慎,设置好警报,如果哪天接口异常,可及早处理(或者设置好默认范围,正常的波对不会很大);
- 涉及提现要注意舍入问题,避免造成金额损失;
viiii
2020-02-24 13:01:44 +08:00
最该注意的难道不是安全么?
dilu
2020-02-24 13:14:21 +08:00
四舍六入五成双了解一下
5bb864e1fc775087
2020-02-24 13:17:50 +08:00
@opengps #3
@lvsshuttao #4
@freakxx #5
可以,那就改用 decimal
gavindexu
2020-02-24 14:18:07 +08:00
int,存储的时候数字先乘 1000
ihacku
2020-02-24 15:04:22 +08:00
后端要校验,我见过好多次前端改包修改订单参数,比如其中一个参数修改为负数,最终一元支付订单的漏洞。
hantsy
2020-02-24 15:45:54 +08:00
Java 用 Money API,https://javamoney.github.io/
asmoker
2020-02-24 15:46:33 +08:00
使用 BigDecimal,设置好 MathContext 和 RoundingMode。
wlfeng
2020-02-24 16:23:23 +08:00
所有跟钱相关的操作一定要留底,所有数据一定要能够溯源
siganushka
2020-02-24 16:24:10 +08:00
后端用 BC math 就可以不用 int 了,用了 int 后端也就可以不用 BC 了,纯 int 技术不会出错。
Aresxue
2020-02-24 16:33:22 +08:00
严格意义上数据库的 decimal 能够满足需求但是数据处理上比较蛋疼,有条件的话用 bigint 存储分,然后整个后端操作里全都使用分单位,尽量避免小数的出现,唯一的缺陷就是 bigint 比较耗费空间 decimal 在 8 位小数时才用 8 个字节,考虑到分单位可能实际中只需要用 5 个字节,相当于每一条记录多浪费 3 个字节的空间,再加上金额这个字段有很多种,结合下来整体的开销还是不小的。所以这就是个用存储换舒适度的问题。
hteen
2020-02-24 16:40:09 +08:00
bc 函数传入参数用 string, 不然要报错
```shell
php > echo bcdiv(0,0.000001,8);
PHP Warning: bcdiv(): Division by zero in php shell code on line 1

Warning: bcdiv(): Division by zero in php shell code on line 1
```
royzheng
2020-02-24 16:41:10 +08:00
你的系统不知道怎么样 ,两个方案你选吧
1. 使用 bigint,固定小数点位置,比如后三位是小数点
2. 使用 decimal
你在这里问,说明你这系统也没多大,所以哪种都行
jakychen
2020-02-24 16:54:30 +08:00
宁愿少给 也不要多给
kylinC
2020-02-24 19:07:19 +08:00
实际舍入模式要根据实际业务来,不能一味地用银行家模式,这样对账时才能理得清。不知道你是做终端用户的还是只是通道转接或者其他,不管哪方面注意筛选风险交易,也就是做好风控,类似的方面还有很多,有些重要地方特别要注意,一不小心就进去了。
luozic
2020-02-24 19:09:43 +08:00
找个专门做这个的律师咨询一下,这种进去了一版不是轻罪

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

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

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

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

© 2021 V2EX