V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rv54ntjwfm3ug8
V2EX  ›  数据库

如何优雅地存储像 BTC 数量这样的高精度浮点数?

  •  
  •   rv54ntjwfm3ug8 · 2021-04-04 19:34:13 +08:00 via iPhone · 3058 次点击
    这是一个创建于 1110 天前的主题,其中的信息可能已经有所发展或是发生改变。
    23 条回复    2021-04-20 20:08:07 +08:00
    syuraking
        1
    syuraking  
       2021-04-04 19:38:51 +08:00   ❤️ 3
    讲个我同事说的笑话:把 BTC 这种长小数,全部乘以 10 的 n 次方当整数保存,显示时,再除回去……dog
    redtea
        2
    redtea  
       2021-04-04 19:43:26 +08:00
    decimal(65,30)
    DTCPSS
        3
    DTCPSS  
       2021-04-04 19:45:38 +08:00
    字符串(逃
    lly0514
        4
    lly0514  
       2021-04-04 19:46:25 +08:00
    以聪为单位就可以了,就是个大整数
    yanzhiling2001
        5
    yanzhiling2001  
       2021-04-04 19:47:13 +08:00
    歪个楼。之前存 IP 地址,带着.不好转换,就把 ip 转成十进制,你用电脑执行

    ping 2130706433

    看看效果。

    相邻 IP 地址转成的十进制数,也是相邻的
    mckelvin
        6
    mckelvin  
       2021-04-04 19:47:30 +08:00   ❤️ 1
    它不是浮点数,因为位数有限,最小单位叫 satoshi.

    > A satoshi is the smallest unit of a bitcoin, equivalent to 100 millionth of a bitcoin.

    1 BTC = 100000000 satoshi
    mxT52CRuqR6o5
        7
    mxT52CRuqR6o5  
       2021-04-04 20:01:54 +08:00
    定点数啊
    moen
        8
    moen  
       2021-04-04 20:13:43 +08:00
    写过智能合约都会知道,存的都是个大整数。在 pg 里可以直接用 numeric 存经过位数转换的数值,graph-node 就是这样做的
    nightwitch
        9
    nightwitch  
       2021-04-04 20:21:48 +08:00
    比特币有最小单位啊。有最小单位的数据直接用大整数就行了。
    DogeElon
        10
    DogeElon  
       2021-04-04 20:52:39 +08:00 via iPhone
    大整数+decimal
    cucldk
        11
    cucldk  
       2021-04-04 21:03:33 +08:00
    涉及人民币的货币系统里,都是存的以“分”为单位的整数,目的是为了避免精度问题,BTC 同理
    LGA1150
        12
    LGA1150  
       2021-04-04 21:31:44 +08:00 via Android
    @yanzhiling2001 因为 IPv4 地址就是个 uint32
    namelosw
        13
    namelosw  
       2021-04-04 21:33:25 +08:00
    1. 聪 = 1
    2. 大整数
    cherryas
        14
    cherryas  
       2021-04-04 21:46:48 +08:00
    bigint
    Rache1
        15
    Rache1  
       2021-04-05 11:15:47 +08:00
    @syuraking 实质上很多都是这样做的,提升通用性,虽然现在有 decimal 可以来更加方便。
    ysc3839
        16
    ysc3839  
       2021-04-05 18:17:22 +08:00 via Android
    想说明一下,小数不完全等于浮点数,浮点数只是存储小数的一种方式。前面提到的“乘以 10 的多少次方用整数存”,其实是“定点数”,因为这种存储方式的小数点是固定的。
    lc7029
        17
    lc7029  
       2021-04-05 20:58:42 +08:00
    varchar,当文本存
    Jonz
        18
    Jonz  
       2021-04-06 08:16:09 +08:00
    @syuraking 貌似没啥大问题?我们之前的系统也是这样处理货币相关数值的。
    knightdf
        19
    knightdf  
       2021-04-06 09:00:33 +08:00
    @syuraking 这是啥笑话?这本来就是解决方案之一啊
    Flymachine
        20
    Flymachine  
       2021-04-06 10:53:37 +08:00
    浮点数本身就不精准,金融业一直是用大整数去存带小数的数值。原生 JS 由于浮点数的精度问题,遇到带小数的数值运算一般也是转成大整数再算的
    Flymachine
        21
    Flymachine  
       2021-04-06 10:55:17 +08:00
    也就是自己写一套高精度运算方法代替原生 JS 的浮点数运算
    lionseun
        22
    lionseun  
       2021-04-06 20:53:51 +08:00 via Android
    @syuraking 这个有什么好笑的?不懂
    ychost
        23
    ychost  
       2021-04-20 20:08:07 +08:00
    decimal.js
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4749 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:51 · PVG 17:51 · LAX 02:51 · JFK 05:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.