﻿---
title: "如何核對代幣的小數位數"
description: "從正確的合約和區塊核對 ERC-20 代幣的 decimals，並在不引入浮點誤差的前提下複核原始餘額、轉帳、授權與跨鏈換算。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何核對代幣的小數位數

> 僅供教育參考，不構成投資或安全建議。小數位數不能證明代幣的身分、價值、儲備或安全性。

<a id="answer"></a>

## 直接答案

對 ERC-20 代幣而言，`decimals()` 是選用的中繼資料，用來告訴介面如何顯示整數形式的代幣單位。如果傳回 `d`，慣用的顯示金額是 `raw / 10^d`。它不會改變合約運算，也不能驗證代幣身分。信任結果前，應核對鏈、確切合約地址、程式碼或代理實作以及區塊。

透過獨立 RPC 在指定區塊直接讀取 `decimals()`，依 ABI 將傳回值解碼為 `uint8`，再與發行方官方合約名錄和可信區塊瀏覽器比較。接著用原始 `balanceOf`、轉帳、授權、收據與事件值檢驗比例。呼叫不存在、回退、傳回畸形資料或與其他證據衝突時，不要默認為 `18`。

<a id="mechanism"></a>

## 運作方式

ERC-20 儲存和移轉的是無號整數金額。顯示層負責插入小數點，合約接收的仍是整數。轉換使用者輸入時應使用十進位字串或任意精度整數運算，絕不能使用二進位浮點數。只有乘以 `10^d` 後得到整數的數量才可表示。

因為 `decimals()` 是選用項目，合規代幣可以不實作它。自訂或可升級實作也可能傳回意外值，或在升級後改變行為。對 ERC-1967 代理，應檢查代理地址、實作或信標、管理員和升級事件；代幣狀態要在代理地址讀取，並將所有比較固定在同一區塊。

授權額度和 ERC-2612 `permit` 的值也是原始整數。轉帳顯示正確，不能證明授權、路由器最低金額、跨鏈金額或會計資料庫採用相同比例。跨鏈橋兩端合約可能使用不同小數位，應依橋的書面換算與捨入規則，分別比較兩端的人類可讀價值和原始單位。

依下列流程核對：

1. 固定鏈 ID 或域、代幣合約、區塊號、RPC 端點和觀察時間。
2. 透過發行方官方名錄確認地址；名稱、符號、圖示和搜尋結果均非權威證據。
3. 檢查已部署程式碼以及地址是否為代理；記錄實作或信標、管理員和近期升級。
4. 呼叫 `decimals()` 並依 ABI 解碼 `uint8`；如實記錄成功、回退、空值或畸形輸出，不要填入預設值。
5. 在相容區塊讀取原始 `balanceOf`、`totalSupply`、授權額、交易 calldata、收據和事件，再按觀察到的比例格式化。
6. 用整數運算重算轉帳、授權、報價和跨鏈金額，並計入費用、捨入、零頭、變基或轉帳稅。
7. 先模擬並傳送小額交易，再核對交易前後的原始餘額；介面、RPC、事件或餘額只要有一處不一致就停止。

<a id="example"></a>

## 範例

- **同一原始值，兩種比例。** 當 `raw = 123456789` 時，`d = 6` 顯示為 `123.456789`；`d = 18` 則顯示為 `0.000000000123456789`，兩者相差 `10^12` 倍。
- **必須考慮可表示性。** 當 `d = 6` 時，`1.25` 個代幣換算為 `1250000` 個原始單位。`0.0000001` 個代幣小於一個原始單位，必須拒絕，或依明確規則捨入。
- **授權比例不符。** 當 `d = 6` 時，`100` 個代幣的授權額是 `100000000`。若按 `d = 18` 編碼，會得到 `100000000000000000000`，比預期大 `10^12` 倍。
- **跨鏈重新縮放。** 若書面規定的 `1:1` 路由把 `d = 6` 的來源代幣轉換為 `d = 18` 的目的表示，來源原始值 `2500000` 表示 `2.5` 個代幣，目的端原始值 `2500000000000000000` 也表示 `2.5`。費用、上限、零頭和實際入帳餘額仍須核對。

<a id="risks"></a>

## 風險

- 在錯誤的鏈上查詢了正確地址。
- 複製的名稱、符號或圖示掩蓋了另一個合約。
- 代理實作或信標在先前檢查後發生變化。
- RPC 或瀏覽器提供過時、未最終確認或互相矛盾的狀態。
- 缺失或畸形中繼資料被默默替換為 `18`。
- 二進位浮點換算對大額或高精度金額產生捨入。
- 錢包正確格式化轉帳，卻錯誤格式化授權或 permit。
- 資料庫混用了原始單位和人類可讀金額。
- 跨鏈橋假定兩端小數位相同，或未揭露零頭捨入。
- 轉帳扣費、變基、鑄造、銷毀、暫停或凍結行為破壞簡單對帳。
- 交易 calldata、事件、收據和實際餘額變化不一致。
- 將小數位核對誤當成發行方、儲備、流動性或安全性的證明。

<a id="misconceptions"></a>

## 常見誤解

- **所有 ERC-20 代幣都有 `18` 位小數。** 該中繼資料是選用的，實作可以傳回其他值。
- **小數位是 EVM 使用的精度位元。** 它是十進位顯示慣例；代幣運算仍是整數運算。
- **瀏覽器格式化的餘額是獨立確認。** 它可能依賴同一次中繼資料呼叫，因而共享同一錯誤。
- **相同符號和小數位可確定同一資產。** 還必須核對正確鏈、確切合約和發行方證據。
- **小額轉帳成功就驗證了所有整合。** 授權、路由器、跨鏈橋、交易所和會計系統可能分別縮放金額。

<a id="related"></a>

## 相關主題

- [代幣合約核驗](/crypto/token-contract-verification/)
- [錢包 calldata 解碼](/crypto/calldata-decoding-wallet/)
- [跨鏈代幣核驗](/crypto/bridge-token-verification/)
- [轉帳扣費代幣風險](/crypto/fee-on-transfer-token-risk/)
- [代理合約](/crypto/proxy-contract/)

<a id="sources"></a>

## 來源

- [ERC-20：代幣標準](https://eips.ethereum.org/EIPS/eip-20) - Ethereum Improvement Proposals（存取日期：2026-08-21）
- [ERC-20](https://docs.openzeppelin.com/contracts/5.x/erc20) - OpenZeppelin Docs（存取日期：2026-08-21）
- [JSON-RPC API](https://ethereum.org/developers/docs/apis/json-rpc/) - ethereum.org（存取日期：2026-08-21）
- [ERC-1967：代理儲存槽](https://eips.ethereum.org/EIPS/eip-1967) - Ethereum Improvement Proposals（存取日期：2026-08-21）
- [ERC-2612：EIP-20 簽章授權的 Permit 擴充](https://eips.ethereum.org/EIPS/eip-2612) - Ethereum Improvement Proposals（存取日期：2026-08-21）

Source: https://wiki.fcontext.com/zh-tw/crypto/token-decimals-verification/index.mdx
