代币精度换算器

合约以整数存储代币余额。选择代币的小数位数(USDT 和 USDC 为 6,WBTC 为 8,大多数 ERC-20 为 18),在原始值与钱包显示的金额之间换算。

由浏览器中的 JavaScript 换算。地址绝不会被上传或存储。

什么是代币精度换算器?

代币精度换算器利用代币的 decimals 值,在代币合约存储的原始整数与钱包显示的可读金额之间换算:金额 = 原始值 ÷ 10decimals。ERC-20 和 TRC-20 合约通过 decimals() 暴露该值;SPL 代币则存储在 Mint 账户中。USDT 和 USDC 使用 6,WBTC 使用 8,类 ETH 代币使用 18。

常见代币的小数位数

代币小数位1 个代币的原始整数
USDT(以太坊、Tron、Solana、Polygon、Arbitrum)61,000,000
USDC(所有主流链)61,000,000
BNB Smart Chain 上的 USDT(Binance-Peg)181,000,000,000,000,000,000
WBTC、cbBTC8100,000,000
ETH、WETH、DAI、LINK、UNI、AAVE181,000,000,000,000,000,000
SOL 及大多数 SPL 代币91,000,000,000
GUSD2100

换算原理

可读金额 = 原始值 ÷ 10decimals,原始值 = 可读金额 × 10decimals。难点在于精度:18 位小数的值超出了浮点数的表示范围,因此本页使用任意精度整数。输入的小数位数超过代币支持范围会被拒绝,因为链上无法表示该金额。

示例

一个 ERC-20 Transfer 事件显示 value = 2500000。如果代币是 USDC(6 位小数),那就是 2.5 USDC。如果同样的数字来自 DAI 转账(18 位小数),则是 0.0000000000025 DAI,一笔粉尘金额。反过来,要发送 0.0025 WBTC(8 位小数),transfer 的参数必须是 0.0025 × 108 = 250,000;发送 1 LINK(18 位小数)则需要 1,000,000,000,000,000,000。

常见错误

代码示例

原生币请参见以太坊单位换算器、聪换算器、lamports 换算器和 sun 换算器。

常见问题

什么是代币小数位数(decimals)?

存储在代币合约中的一个数字,表示原始整数中有多少位是小数部分。USDT 有 6 位小数,所以原始余额 1,500,000 就是 1.5 USDT。ETH 和大多数 ERC-20 代币使用 18。

在哪里能找到代币的小数位数?

在 Etherscan、Tronscan 或 Solscan 的代币页面上,或对 ERC-20 / TRC-20 合约调用 decimals()。SPL 代币的小数位数在 Mint 账户中。

为什么我的转账显示为一个巨大的数字?

你看到的是原始值。除以 10decimals:USDT 转账 25000000 是 25 USDT;类 ETH 代币转账 1000000000000000000 是 1 个代币。

可以用于 EIP-681 二维码吗?

可以。EIP-681 代币转账中的 uint256 参数必须是原始整数。在这里输入可读金额并复制原始值,或者直接使用会自动完成此操作的 USDT ERC-20 二维码生成器。

为什么大多数 ERC-20 代币使用 18 位小数?

因为 ETH 本身就是 18 位(1 ETH = 1018 wei),早期代币合约沿用了这一惯例。稳定币选择 6 位以对应分级别的记账并留有余量,包装比特币代币则使用 8 位以匹配聪。

USDT 在每条链上的小数位数都一样吗?

USDT 在以太坊、Tron、Solana、Polygon 和大多数链上使用 6 位,但部分跨链桥版本不同(例如 BNB Smart Chain 上是 18 位)。请务必检查具体合约。