区块链浮点数为什么没法直接写进合约 精度和Gas成本到底怎么解决
Bitpie官方网站 2026年10月30日 16:18:27 Bitpie钱包官方app下载 6
区块链浮点数这个坑, 我在这个DeFi协议开发的过程中, 算是踩得最深了。以太坊Smart合约里面没有原生的浮点类型这个东西。所以价格和利率还有汇率这些变量, 全部都得用整数来模拟。
至于那个小数点的位置在哪, 全靠开发的人员自己在心里定夺。这件事情乍一看好像挺简单的一种样子。但是真正到了具体的工程实现阶段之后会发现, 这里面全都是各种各样的坑在那里等着人。
区块链浮点数怎么存
最主流的一种做法是使用定点数(Fixed-Point), 这一做法的具体内容是把浮点数值进行放大处理, 放大的倍数是一十的N次方, 然后把它转换成一个整数, 再把这一个整数存储进去。
在Uniswap v3这个系统中, 价格的表示采用了Q96这种格式, 而利率则是以bps为单位来进行表示的, 从本质上来看, 这些处理方式全都属于同一套思路。

如果N取的数值过大了, 就会导致整数的数据发生溢出的情况;相反地, 如果N取的数值过小了呢, 那直接带来的结果就是精度的下降, 这会导致部分数据信息的丢失。
我见过这样一个团队, 他们把汇率这个数字放大到了10的18次方, 结果导致两条链中间的商人在进行套利操作的时候, 只要做一次乘法运算, 数值就会超过uint256这个类型的上限,合约代码就直接回退报错, 这种 bug 在真实运行的线上环境非常难以复现, 因为在测试环境里面数据量根本不够大, 所以是绝对发现不了的。
区块链浮点数精度够吗
说够用是假的。18位uint256听着够大, 但是你拿来存0.0000001这种数, 有效精度直接被高位吃掉一大截。DeFi跨协议资金池算多了之后, 误差攒在一起, 滑点就变了。
情况变得更为复杂的是Gas成本这一因素, 原因在于执行一次浮点数的模拟运算所花费的费用, 要比执行原生的加法操作昂贵出好几倍之多, 因此在进行高频的DeFi场景处理时, 仅就Gas费用而言就会让人感到难以承担和支撑下去, 于是, 在如今的多数协议当中, 大家选择让Chainlink来提供价格数据输入, 进而将实际的运算过程推移到链下进行, 从而使得区块链上只需要负责验证相关数据的操作即可, 这种做法在一定程度上可以被视作为一种折中性的解决方案。
这个事情是没有一种办法能够永远解决问题并且不需要再次调整的方案的, 每一个协议都是需要按照自己业务的情况把精度、成本、安全这三方的关系掰扯清楚的, 不要想着去抄别人位数就完事了。