Web3js
如何將小於 18 位小數的 ERC20 最小單位轉換為完整硬幣而不會出現舍入錯誤?
我可以對所有小數點後 18 位的令牌使用 web3 的 fromWei 函式,但我不確定如何將令牌轉換為完整令牌而不必擔心舍入錯誤。
例如轉換 15 位小數的令牌:
將 12345 轉換為 0.000000000012345 等等。
任何幫助表示讚賞
在 JavaScript 中使用類似
BigNumber
or的庫BN
對於避免浮點表示中的捨入錯誤很重要。使用 web3.js:
> web3.toBigNumber(12345).div(10**15).toFixed() < "0.000000000012345"
請注意,當您從 JavaScript 呼叫智能合約時,您通常會
BigNumber
首先取回一個對象,因此您可以從那裡開始(例如result.div(10**15).toFixed()
)。
由於小數限制,可能存在舍入錯誤。
具有 18 位小數的標記可能(並且確實)存在舍入錯誤。
EVM 將
floor
或向下舍入到最接近的整數。提前知道這一點,開發人員可以適當而準確地進行數學計算。
// assuming the usage of `new BN()` - pseudocode below To convert 1 token to 18 decimals: (1.mul(1e18)) = 1000000000000000000 To convert 1 token to 15 decimals: (1.mul(1e15)) = 1000000000000000 To convert 12345 (assuming smallest unit) to decimal representation (15): (12345.div(1e15)) = 0.000000000012345
就個人而言,我喜歡在 javascript 中將令牌的最小子單元作為一個整體單元來處理。然後我可以接受
floor
我的結果並相信這就是 EVM 將如何處理計算。例子:
令牌小數點:15
使用者 A 餘額:3.5 個代幣
由 uint256 表示的實際餘額:3500000000000000 <- 這是我使用的數字