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支持最多小数点后六位的转账

我们也找到了有6位数小数点的转账
https://etherscan.io/tx/0x543c3e23073b339d3aa17a252b275b57ba158542d1997928c3cd259023506688
在这笔转账中,转的token是213.778057个USDT

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

如果这个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
