Web3js

如何將小於 18 位小數的 ERC20 最小單位轉換為完整硬幣而不會出現舍入錯誤?

  • April 21, 2019

我可以對所有小數點後 18 位的令牌使用 web3 的 fromWei 函式,但我不確定如何將令牌轉換為完整令牌而不必擔心舍入錯誤。

例如轉換 15 位小數的令牌:

將 12345 轉換為 0.000000000012345 等等。

任何幫助表示讚賞

在 JavaScript 中使用類似BigNumberor的庫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 <- 這是我使用的數字

引用自:https://ethereum.stackexchange.com/questions/68401