You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Go语言获取的ERC20 USDT余额数值转换为标准USDT格式

解决ERC20 USDT余额格式转换问题

这是因为USDT(以及绝大多数ERC20稳定币)采用了6位小数的精度设计——合约内部存储的余额数值,是实际显示金额乘以10^6后的整数结果。你拿到的917750889,本质就是917.750889 * 10^6,所以只需要将这个整数除以10^6,就能得到符合用户认知的标准USDT格式。

具体Go代码实现

我们可以用Go标准库的math/big包来处理这个转换,避免普通浮点数带来的精度丢失问题(尤其是面对大额余额时)。修改你的代码如下:

import (
    "fmt"
    "log"
    "math/big"
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/ethclient"
    // 这里导入你生成的TetherToken合约绑定代码
)

func tetherAmount(addrHex string) {
    conn, err := ethclient.Dial("https://mainnet.infura.io/v3/[api_here]")
    if err != nil {
        log.Fatal("Whoops something went wrong!", err)
    }
    contract, err := NewTetherToken(common.HexToAddress("0xdAC17F958D2ee523a2206206994597C13D831ec7"), conn)
    if err != nil {
        log.Fatalf("Failed to initiate contract: %v", err)
    }
    // 不要忽略error,添加错误处理
    amount, err := contract.BalanceOf(&bind.CallOpts{}, common.HexToAddress(addrHex))
    if err != nil {
        log.Fatalf("Failed to fetch balance: %v", err)
    }

    // 转换为标准USDT格式:除以10^6
    decimalBalance := new(big.Float).SetInt(amount)
    divisor := new(big.Float).SetFloat64(1_000_000)
    usdtBalance := new(big.Float).Quo(decimalBalance, divisor)

    // 以6位小数格式输出,符合USDT的精度标准
    fmt.Printf("USDT Balance: %.6f\n", usdtBalance)
}

关键注意点

  • 为什么用big.Float?因为ERC20合约返回的*big.Int可能是非常大的数值(比如数百万甚至数十亿USDT),普通的float64无法精准表示所有大整数,会出现精度丢失问题,而big.Float可以完美处理这类高精度计算。
  • 不要忽略BalanceOf的返回error:实际生产代码里一定要处理这个错误,避免因网络问题、地址无效等情况导致程序崩溃或得到错误结果。

内容的提问来源于stack exchange,提问作者root

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:32:49