储存价格的字段,单位用元还是分好 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
vinsony
V2EX    程序员

储存价格的字段,单位用元还是分好

  •  
  •   vinsony2015-06-17 12:36:12 +08:00 10702 次点击
    这是一个创建于 3824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用分为单位可以用int型,比较好计算,但是一般用户输入个显示的单位都是元,需要转换比较繁琐。
    大家一般用什么作单位的?

    27 条回复    2015-06-18 07:37:13 +08:00
    Septembers
        1
    Septembers  
       2015-06-17 12:39:32 +08:00 via Android
    您在做死
    neoblackcap
        2
    neoblackcap  
       2015-06-17 12:42:35 +08:00
    用精确的数据类型存储,你的数据类型若是能精确保存分数比如1/3之类的,你用什么单位都一样。

    若是不能就乖乖地用分对应整型或者长整型来保存,反正微信那边的人是这样做。
    vinsony
        3
    vinsony  
    OP
       2015-06-17 12:49:00 +08:00
    我现在用的很黄很暴力的varchar....单位是元..
    Mutoo
        4
    Mutoo  
       2015-06-17 12:49:59 +08:00
    decimal <- 正解 如果不做汇率转换,直接用元就行了。
    love
        5
    love  
       2015-06-17 12:51:09 +08:00
    Javascript中的计算呢?用int? 毕竟0.1 + 0.1 + 0.1 !== 0.3有时也要命的
    bigdude
        6
    bigdude  
       2015-06-17 12:51:48 +08:00
    decimal啊
    jedrek
        7
    jedrek  
       2015-06-17 12:53:54 +08:00
    《高性能MySQL》中建议用整数类型保存,必要的时候移动小数点即可
    quix
        8
    quix  
       2015-06-17 15:10:02 +08:00
    支持ls , 用 decimal, 本质是用字符串保存的数字
    mahone3297
        9
    mahone3297  
       2015-06-17 15:11:20 +08:00
    建议整形。。。
    davidyin
        10
    davidyin  
       2015-06-17 15:15:23 +08:00
    整数,到分
    learnshare
        11
    learnshare  
       2015-06-17 15:44:09 +08:00
    用分的整数比较好
    garfeildma
        12
    garfeildma  
       2015-06-17 17:03:32 +08:00
    整数,分,用decimal才是作死
    xmbaozi
        13
    xmbaozi  
       2015-06-17 17:07:27 +08:00
    用分的话 万一哪个地方忘了转换成元岂不是悲剧
    b821025551b
        14
    b821025551b  
       2015-06-17 17:07:32 +08:00
    精确到毫,用long存储;流水大业务复杂的话用分存误差太大。
    b821025551b
        15
    b821025551b  
       2015-06-17 17:12:47 +08:00
    @xmbaozi 养成习惯就好了,前公司所有的金额字段都是精确到毫,各种计算按豪,只有最后展示或调用支付宝api才格式化成元。
    keary
        16
    keary  
       2015-06-17 17:21:31 +08:00
    看你的业务需要了,如果需要考虑以后支持不同币种的话,务必使用decimal;如果只支持人民币单一币种就直接int或者long就可以了。
    vinsony
        17
    vinsony  
    OP
       2015-06-17 17:53:10 +08:00
    @b821025551b 经常有网站超低价卖东西,可能就是忘了多按两个零.... o(∩_∩)o
    loveuqian
        18
    loveuqian  
       2015-06-17 18:45:55 +08:00
    用String最好。。。。。23333
    lilydjwg
        19
    lilydjwg  
       2015-06-17 19:24:48 +08:00
    @quix decimal,至少是正确实现的 decimal,是使用十进制数的。而且其运算 CPU 也有直接支持。

    @neoblackcap 金融很少有需要使用分数的情况吧。大部分情况都是精确到分,比如某商品三件一块钱,那么买一件就是 0.33RMB,两件就是 0.67RMB。

    @xmbaozi 除了调试的时候,你应该只有一个地方来做这种转换。

    通常表示价格的需求,定点数最好。
    arslion
        20
    arslion  
       2015-06-17 19:28:19 +08:00
    分(认真脸)
    quix
        21
    quix  
       2015-06-17 19:59:13 +08:00
    @lilydjwg 查了一下文档, mysql 5.0.3之前的版本确实是用string 储存的, 现在确实都是使用binary保存了.
    imn1
        22
    imn1  
       2015-06-17 20:10:51 +08:00
    用分是肯定不够的,除非纯粹只是显示
    别说证券、汇率用到厘的情况很多,即使一般财务做一些统计学计算,那时发现只到分是很头痛的事
    neoblackcap
        23
    neoblackcap  
       2015-06-17 22:11:20 +08:00
    @lilydjwg 这高精度的数据结构就好。因为单看int我都不知道楼主在说哪个领域,数据库还是编程语言,好比C就没有原生的decimal但有int。
    shakoon
        24
    shakoon  
       2015-06-17 22:12:42 +08:00
    银行用number(22,2)
    lujiajing1126
        25
    lujiajing1126  
       2015-06-17 22:35:51 +08:00
    我司用的都是分

    用64位的系统,Java的话货币可以用BigDecimal,c,cpp可以用long或者long long吧,sql(mysql,hive)里面BigInt

    至于Javascript。。。。没办法。。你就用字符串吧。。
    ryd994
        26
    ryd994  
       2015-06-17 22:54:15 +08:00
    除了输出的时候/100其他时候根本不用转换
    有什么繁琐的?
    lilydjwg
        27
    lilydjwg  
       2015-06-18 07:37:13 +08:00
    @lujiajing1126 C 可以用 mpdecimal 的。Java 都有库的东西 C 和 C++ 不太可能没有。
    @quix MySQL 还真拿过字符串表示十进制数啊,这 My- 前缀再一次被表现了 :-D
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2719 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 11:21 PVG 19:21 LAX 03:21 JFK 06:21
    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