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

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

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

    用分为单位可以用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   ·   实用小工具   ·   2922 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.