我有个一个保留 2 位小数的浮点数需要保存, 我是把它乘以 100,按照 int 存,还是按照 decimal(4,2)来存? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
hackingwu
V2EX    程序员

我有个一个保留 2 位小数的浮点数需要保存, 我是把它乘以 100,按照 int 存,还是按照 decimal(4,2)来存?
  •  
  •   hackingwu
    hackingwu 2020-09-23 09:28:09 +08:00 3970 次点击

    这是一个创建于 1848 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个字段要保留 2 位小数,我是按照 decimal(4,2)来存,还是乘以 100,按照 int 来存,返回给使用者的时候在做个转换。目的是 decimal(4,2)占了 8bytes,int 才 4bytes, 我这个表有 10 来个 decimal 的字段。

    26 条回复    2020-09-23 19:15:59 +08:00
    opengps
        1
    opengps  
       2020-09-23 09:30:15 +08:00 via Android
    其实,对于你的数据规模来讲,未必需要在乎这 2 个字节的节省
    建议你先评估下数据规模有多大,是否真的需要省空间,然后才考虑是否可以用 cpu 换硬盘
    opengps
        2
    opengps  
       2020-09-23 09:35:50 +08:00 via Android
    换句话说,硬盘比 CPU 便宜,一般推荐存储上选用最方便的数据结构。
    你硬盘紧张就把表设计的紧凑点,CPU 紧张就尽量少做运算
    wangritian
        3
    wangritian  
       2020-09-23 09:42:00 +08:00
    我是乘以 100 存整数了,感觉做统计计算时比浮点数速度会快一点
    coderluan
        4
    coderluan  
       2020-09-23 10:18:03 +08:00
    你不说具体场景和目的, 那就是都行.
    securityCoding
        5
    securityCoding  
       2020-09-23 10:22:17 +08:00
    int/long , 来自互金公司的经验
    redtea
        6
    redtea  
       2020-09-23 10:36:56 +08:00 via iPhone
    起码乘 10000,否则哪天改成保留 4 位,那就太麻烦了。
    la2la
        7
    la2la  
       2020-09-23 10:38:51 +08:00
    @redtea 哈哈,真实
    wysnylc
        8
    wysnylc  
       2020-09-23 10:39:19 +08:00
    你猜 decimal 为什么要被发明出来?
    keepeye
        9
    keepeye  
       2020-09-23 10:44:21 +08:00
    涉及到钱的最好存整数
    justseemore
        10
    justseemore  
       2020-09-23 11:42:47 +08:00
    @securityCoding 同来自前互金公司的经验 decimal 18,6 bcmath 处理
    IvanLi127
        11
    IvanLi127  
       2020-09-23 11:49:55 +08:00 via Android
    哪天换算错了就完了,还是存 decimal 吧
    mxT52CRuqR6o5
        12
    mxT52CRuqR6o5  
       2020-09-23 11:59:22 +08:00 via Android
    要看具体业务的
    xuanbg
        13
    xuanbg  
       2020-09-23 11:59:32 +08:00
    decimal 就是干这个的
    May725
        14
    May725  
       2020-09-23 12:50:11 +08:00 via iPhone
    考虑具体业务、预估数据规模、以及将来可能的需求变化,综合考虑吧
    reus
        15
    reus  
       2020-09-23 14:30:14 +08:00 via Android
    用 decimal 不需要记得换算,不记得换算的话,可能会有百倍的损失。
    当然选 decimal,存储很贵吗?你省下的存储,都变成了潜在的风险,有代价的。
    KarlChen2015
        16
    KarlChen2015  
       2020-09-23 15:55:15 +08:00
    显然选择 decimal
    如果一个新人不知道100 的设计,后果不堪设想
    winglight2016
        17
    winglight2016  
       2020-09-23 17:00:04 +08:00
    @KarlChen2015 我想起之前在 v2 上就有个实习生发了一个帖子说自己计算汇率忘记这个*100 的操作,给公司造成了上千万的损失。。。
    InkStone
        18
    InkStone  
       2020-09-23 17:03:11 +08:00
    不需要极限压榨性能和存储的话,肯定是怎么直观怎么来,不要添加额外的思维负担
    daozhihun
        19
    daozhihun  
       2020-09-23 17:04:57 +08:00
    曾经做过的某负责处理钱的模块都是存的 decimal 。当然存 long/int 也可以(建议乘以 10000 或者 1000000 ),可以提升一点性能,但个人认为现在的处理能力不用考虑那点性能,个人还是偏好 decimal
    Chappako
        20
    Chappako  
       2020-09-23 17:07:53 +08:00
    @zpfhbyx #10 同 decimal + bcmath 处理
    dr1q65MfKFKHnJr6
        21
    dr1q65MfKFKHnJr6  
       2020-09-23 17:41:35 +08:00
    不管什么场景, 直接按类型存吧。
    decimal 发明出来 不就是为了处理浮点数的?
    Veneris
        22
    Veneris  
      &nbs;2020-09-23 17:46:50 +08:00
    以微信和美团的数据结构看,都是以分做单位。
    newmlp
        23
    newmlp  
       2020-09-23 18:38:52 +08:00
    建议 decimal,int 容易出 bug,到处都要换算,万一哪里忘了找起来也麻烦
    F281M6Dh8DXpD1g2
        24
    F281M6Dh8DXpD1g2  
       2020-09-23 18:45:41 +08:00 via iPhone
    跟钱有关的不用 decimal 是真的心大
    lululau
        25
    lululau  
       2020-09-23 18:56:15 +08:00 via iPhone
    int*100 是空间和时间兼得吧,缺点是需要自己换算倍数关系,但是从运行效率上讲,int*100 应该比 bigdecimal 快吧
    sheeta
        26
    sheeta  
       2020-09-23 19:15:59 +08:00
    看看腾讯,支付宝它们是怎么做的不就行了呗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5889 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 02:36 PVG 10:36 LAX 19:36 JFK 22:36
    Do have faith in what you're doing.
    ubao 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