토큰 소수점 변환기란?
토큰 소수점 변환기는 토큰 컨트랙트가 저장하는 원시 정수와 지갑이 표시하는 사람용 금액 사이를 토큰의 decimals 값으로 변환합니다: 금액 = 원시 값 ÷ 10decimals. ERC-20과 TRC-20 컨트랙트는 decimals()로 이를 노출하고, SPL 민트는 민트 계정에 저장합니다. USDT와 USDC는 6, WBTC는 8, ETH 계열 토큰은 18을 사용합니다.
흔한 토큰 decimals
| 토큰 | Decimals | 1 토큰의 원시 정수 |
|---|---|---|
| USDT (Ethereum, Tron, Solana, Polygon, Arbitrum) | 6 | 1,000,000 |
| USDC (모든 주요 체인) | 6 | 1,000,000 |
| BNB Smart Chain의 USDT (Binance-Peg) | 18 | 1,000,000,000,000,000,000 |
| WBTC, cbBTC | 8 | 100,000,000 |
| ETH, WETH, DAI, LINK, UNI, AAVE | 18 | 1,000,000,000,000,000,000 |
| SOL 및 대부분의 SPL 토큰 | 9 | 1,000,000,000 |
| GUSD | 2 | 100 |
변환 작동 방식
사람용 = 원시 값 ÷ 10decimals, 원시 값 = 사람용 × 10decimals. 문제는 정밀도입니다: 18자리 소수 값은 부동소수점이 표현할 수 있는 범위를 넘어서므로 이 페이지는 임의 정밀도 정수를 사용합니다. 토큰이 지원하는 것보다 많은 소수 자릿수를 입력하면 체인이 그 금액을 표현할 수 없으므로 거부됩니다.
예시
ERC-20 Transfer 이벤트에 value = 2500000이 표시됩니다. 토큰이 USDC(6 decimals)라면 2.5 USDC입니다. 같은 숫자가 DAI 전송(18 decimals)에서 나왔다면 0.0000000000025 DAI, 즉 먼지 수준의 금액입니다. 반대로 0.0025 WBTC(8 decimals)를 보내려면 transfer의 인수가 0.0025 × 108 = 250,000이어야 하고, 1 LINK(18 decimals)를 보내려면 1,000,000,000,000,000,000이 필요합니다.
흔한 실수
- 18이라고 가정. 1018을 하드코딩하면 100 USDC 결제가 0.0000000001 USDC가 됩니다. 컨트랙트에서
decimals()를 읽으세요. - 심볼을 신뢰. 같은 티커의 브리지된 토큰이 체인마다 다른 decimals를 쓸 수 있습니다. 실제로 상호작용하는 컨트랙트를 확인하세요.
- 곱하기 전에 반올림. 먼저 사람용 금액을 원시 정수로 변환한 뒤 정수로 연산하세요. 부동소수점은 2500000 대신 2499999.9999를 만들 수 있습니다.
코드에서
- ethers.js:
ethers.parseUnits("1.5", 6)→1500000n;ethers.formatUnits(1500000n, 6)→"1.5". - web3.py:
int(Decimal("1.5") * 10**6);float는 피하세요. - Solana web3.js:
createTransferInstruction의 금액은 원시 정수입니다. BigInt로10 ** mint.decimals를 곱하세요.
네이티브 코인은 이더리움 단위 변환기, 사토시 변환기, lamports 변환기, sun 변환기를 참고하세요.