V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hackingwu
V2EX  ›  程序员

我有个一个保留 2 位小数的浮点数需要保存, 我是把它乘以 100,按照 int 存,还是按照 decimal(4,2)来存?

  •  
  •   hackingwu ·
    hackingwu · 2020-09-23 09:28:09 +08:00 · 3570 次点击
    这是一个创建于 1513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个字段要保留 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
    涉及到钱的最好存整数
    zpfhbyx
        10
    zpfhbyx  
       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 处理
    cedoo22
        21
    cedoo22  
       2020-09-23 17:41:35 +08:00
    不管什么场景, 直接按类型存吧。
    decimal 发明出来 不就是为了处理浮点数的?
    Veneris
        22
    Veneris  
       2020-09-23 17:46:50 +08:00
    以微信和美团的数据结构看,都是以分做单位。
    newmlp
        23
    newmlp  
       2020-09-23 18:38:52 +08:00
    建议 decimal,int 容易出 bug,到处都要换算,万一哪里忘了找起来也麻烦
    liprais
        24
    liprais  
       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   ·   实用小工具   ·   1367 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:45 · PVG 01:45 · LAX 09:45 · JFK 12:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.