# 理解ERC20中的decimals

By [B+](https://paragraph.com/@b-2) · 2023-04-11

---

decimals 本身是小数的意思，在区块链的ERC20的智能合约里边，也存在一个只读的decimals的方法。这个方法一般返回的是一个小于18的整数。为什么需要这个方法，他设计的初衷是什么，以及如何运用是这篇文章将要探讨的主题

他的作用是能将token分成任意小份。假设有一个Token叫PAI, 小明有3个PAI，想转账1.5个PAI给小红，自己留1.5个。这样的操作在solidity语言中是不被支持的。因为solidity只支持整数，所以你就只能转1或则2，不能转1.5个token

而ERC20里边定义decimals就是为了解决这一问题。如上边例子，如果PAI想要支持转账小数位后1位，那么他会将decimal就可以设置为1，那么余额的30就代表有3个PAI。这种情况下，小明可以转15给小红，也就实现了转1.5个PAI token

### 现实例子：

在Ethereum里，USDT的decimals是6，也就是说USDT支持最多小数点后六位的转账

![](https://storage.googleapis.com/papyrus_images/06df986d6cd84ff6644196a4eb46c7a025515337c27caf0f828305def3d0dfec.png)

我们也找到了有6位数小数点的转账

[https://etherscan.io/tx/0x543c3e23073b339d3aa17a252b275b57ba158542d1997928c3cd259023506688](https://etherscan.io/tx/0x543c3e23073b339d3aa17a252b275b57ba158542d1997928c3cd259023506688)

在这笔转账中，转的token是213.778057个USDT

![](https://storage.googleapis.com/papyrus_images/b74c0dee1f31f10ad77f639888f186b40a2f245686431e1d6ffa80410857fecd.png)

而我们查看转账的log会发现，这笔钱是以213778057转入的

![](https://storage.googleapis.com/papyrus_images/3152ca4a3a6d4d695db269b275794697c9e4314af6d8a4675fbcc6378c99ea47.png)

如果这个ERC20的智能合约接受的value是这样的格式，那当我调用ERC20 smart contract的transfer方法的时候，我如何知道并把我想要转账的金额呢，下边的代码可以帮你解决这个问题：

    import ethers from 'ethers';
    
    const transferAmount = 2.12;
    const decimals = await ERC20.decimals(); // 6
    const value = ethers.utils.parseUnits(transferAmount, decimals); // 2120000
    
    // when want to convert the transfer value to the token amount:
    ethers.utils.formatUnits(value, decimals) // 2.12

---

*Originally published on [B+](https://paragraph.com/@b-2/erc20-decimals)*
