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

2021-04-04 19:34:13 +08:00
 rv54ntjwfm3ug8
3066 次点击
所在节点    数据库
23 条回复
syuraking
2021-04-04 19:38:51 +08:00
讲个我同事说的笑话:把 BTC 这种长小数,全部乘以 10 的 n 次方当整数保存,显示时,再除回去……dog
redtea
2021-04-04 19:43:26 +08:00
decimal(65,30)
DTCPSS
2021-04-04 19:45:38 +08:00
字符串(逃
lly0514
2021-04-04 19:46:25 +08:00
以聪为单位就可以了,就是个大整数
yanzhiling2001
2021-04-04 19:47:13 +08:00
歪个楼。之前存 IP 地址,带着.不好转换,就把 ip 转成十进制,你用电脑执行

ping 2130706433

看看效果。

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

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

1 BTC = 100000000 satoshi
mxT52CRuqR6o5
2021-04-04 20:01:54 +08:00
定点数啊
moen
2021-04-04 20:13:43 +08:00
写过智能合约都会知道,存的都是个大整数。在 pg 里可以直接用 numeric 存经过位数转换的数值,graph-node 就是这样做的
nightwitch
2021-04-04 20:21:48 +08:00
比特币有最小单位啊。有最小单位的数据直接用大整数就行了。
DogeElon
2021-04-04 20:52:39 +08:00
大整数+decimal
cucldk
2021-04-04 21:03:33 +08:00
涉及人民币的货币系统里,都是存的以“分”为单位的整数,目的是为了避免精度问题,BTC 同理
LGA1150
2021-04-04 21:31:44 +08:00
@yanzhiling2001 因为 IPv4 地址就是个 uint32
namelosw
2021-04-04 21:33:25 +08:00
1. 聪 = 1
2. 大整数
cherryas
2021-04-04 21:46:48 +08:00
bigint
Rache1
2021-04-05 11:15:47 +08:00
@syuraking 实质上很多都是这样做的,提升通用性,虽然现在有 decimal 可以来更加方便。
ysc3839
2021-04-05 18:17:22 +08:00
想说明一下,小数不完全等于浮点数,浮点数只是存储小数的一种方式。前面提到的“乘以 10 的多少次方用整数存”,其实是“定点数”,因为这种存储方式的小数点是固定的。
lc7029
2021-04-05 20:58:42 +08:00
varchar,当文本存
Jonz
2021-04-06 08:16:09 +08:00
@syuraking 貌似没啥大问题?我们之前的系统也是这样处理货币相关数值的。
knightdf
2021-04-06 09:00:33 +08:00
@syuraking 这是啥笑话?这本来就是解决方案之一啊
Flymachine
2021-04-06 10:53:37 +08:00
浮点数本身就不精准,金融业一直是用大整数去存带小数的数值。原生 JS 由于浮点数的精度问题,遇到带小数的数值运算一般也是转成大整数再算的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/767974

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX