支付相关存储金额的数据库字段,用整型还是 Decimal? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dzmcs
V2EX    问与答

支付相关存储金额的数据库字段,用整型还是 Decimal?

  •  1
     
  •   dzmcs 2019-09-27 10:42:37 +08:00 8482 次点击
    这是一个创建于 2259 天前的主题,其中的信息可能已经有所发展或是发生改变。

    支付相关存储金额的数据库字段,用整型还是 Decimal?

    整型要转为分,能不能用 Decimal 呢?

    Decimal 会不会最后帐配不平?

    21 条回复    2019-09-27 18:30:50 +08:00
    jackyin
        1
    jackyin  
       2019-09-27 10:51:56 +08:00   1
    金额用整型存储分比较好,显示金额转化为元即可,传输、存储最好都用整型分。
    U7Q5tLAex2FI0o0g
        2
    U7Q5tLAex2FI0o0g  
       2019-09-27 10:53:40 +08:00
    肯定用整型,没的讨论的,结贴
    b821025551b
        3
    b821025551b  
       2019-09-27 10:54:47 +08:00
    别用 Decimal,decimal 读到业务层还是 float,各种分账转换后还是出问题;金额永远是 int,业务层最后展示再转成元。
    l00t
        4
    l00t  
       2019-09-27 10:57:23 +08:00
    什么数据库?整型是多长?

    这俩本身没有什么实质差别。用 Decimal 更方便一些。
    dzmcs
        5
    dzmcs  
    OP
       2019-09-27 11:05:18 +08:00
    @l00t
    postgresql,现在很多语言也有 Decimal 类型,但是都说用整型,了解一下有没有用 Decimal 类型的
    kidtest
        6
    kidtest  
       2019-09-27 11:06:50 +08:00
    一般精确到分足够用了吧,直接乘以 100 存整形
    gfreezy
        7
    gfreezy  
       2019-09-27 11:11:04 +08:00
    用户端精确到分够了,但是涉及到分佣,1 分钱乘个 3% 啥的,怎么也得小数点后 5 6 位。除非合同规则里面写明精确到分,四舍五入。
    gfreezy
        8
    gfreezy  
       2019-09-27 11:11:41 +08:00
    我们系统直接用了 Decimal,但是这样要求所有地方的代码也得都用 Decimal
    wysnylc
        9
    wysnylc  
       2019-09-27 11:18:37 +08:00
    用 Decimal,代码也用 Decimal 就行
    用整型拆分的多此一举,没 Decimal 的时候没办法,有 Decimal 还这么做就跟不上时代了
    passerbytiny
        10
    passerbytiny  
       2019-09-27 11:19:56 +08:00
    只要不用浮点,都行。

    当然,在没有最终性能优化需要的情况下,数据库请尽量用可读性好的数据,带少量小数位的数值就用 Decimal/Number/Numeric 类型,日期时间就用 Date/DateTime 类型。不过如果你对应的编程语言没有十进制对应的类型,那么就像前 3 楼那样用替代类型(金额放大成整数,时间用时间戳,日期用整数)好了。

    一般来说,金额是必定用十进制类型的,除了不用转换外,在精度控制和四舍五入上也很方便。
    l00t
        11
    l00t  
       2019-09-27 11:21:09 +08:00
    @dzmcs #5 那至少得 bigint 了。单 int 是不够用的。也可以考虑用 decimal 或者 numeric,这俩本身也是同一回事。帐配不平的事情是不存在的,不用多虑。帐要是不平,肯定是你们程序自己出了问题,而不是 decimal 的数据类型问题。
    randyo
        12
    randyo  
       2019-09-27 11:28:26 +08:00 via Android
    记得 c#有 decimal 类型。以前用 double 老是算错,换了 decimal 就没问题了。
    Raymon111111
        13
    Raymon111111  
       2019-09-27 11:31:15 +08:00
    整型处理简单不容易出错

    帐不平那是程序逻辑的问题吧, 这里多了一分肯定是另外一个地方要扣一分啊
    bk201
        14
    bk201  
       2019-09-27 11:33:49 +08:00
    那问题来了,日期你们用整型还是 datetime
    efaun
        15
    efaun  
       2019-09-27 11:37:50 +08:00
    整型,存分
    IMCA1024
        16
    IMCA1024  
       2019-09-27 15:53:12 +08:00
    财务系统,用的 decimal。 存储多几位而已
    IMCA1024
        17
    IMCA1024  
       2019-09-27 15:53:38 +08:00
    @IMCA1024 小数点后,多存几位
    rockyou12
        18
    rockyou12  
       2019-09-27 15:59:51 +08:00
    我们的系统数据库钱和库存都是用 decimal,代码里是 java,用 bigdecimal
    ytmsdy
        19
    ytmsdy  
       2019-09-27 16:19:50 +08:00
    金额强烈建议用 int,之前有个项目觉得用 decimal 好像也没问题,但是实际当金额进行折扣计算,还是会出现四舍五入的问题。单单为了这个增加了不知道多少的工作量
    qdyoungk
        20
    qdyoungk  
       2019-09-27 17:40:28 +08:00
    科蓝用 Decimal
    gIrl1990
        21
    gIrl1990  
       2019-09-27 18:30:50 +08:00
    @ytmsdy java 吗?要选对方法吧,不然丢精度。下面两个是正确的
    BigDecimal.valueOf(double) 不信试试 new BigDecimal(0.1D)
    new BigDecimal(float.toString()); 不信试试 new BigDecimal(0.1F) 或者 BigDecimal.valueOf(0.1F)
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1059 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 23:03 PVG 07:03 LAX 15:03 JFK 18:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86