首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将小于18个小数的最小ERC20单位转换成不带四舍五入误差的完整硬币?

问如何将小于18个小数的最小ERC20单位转换成不带四舍五入误差的完整硬币?
EN

Ethereum用户
提问于 2019-03-15 14:55:59
回答 2查看 1.7K关注 0票数 2

我只需使用web3's的fromWei功能,所有的令牌有18位小数点,但我不知道如何将令牌转换为完全令牌,而不必担心舍入错误。

例如,用15小数位数转换一个令牌:

将12345转换为0.000000000012345,等等。

任何帮助都是非常感谢的。

EN

回答 2

Ethereum用户

回答已采纳

发布于 2019-03-15 19:32:16

使用像BigNumber或BN这样的库在JavaScript中非常重要,以避免浮点表示中的舍入错误。

使用web3.js:

代码语言:javascript
复制
> web3.toBigNumber(12345).div(10**15).toFixed()
< "0.000000000012345"

请注意,当您从JavaScript调用智能契约时,通常首先会得到一个BigNumber对象,因此您可以从那里开始(例如,result.div(10**15).toFixed())。

票数 0
EN

Ethereum用户

发布于 2019-03-15 19:28:01

在限制小数的情况下,舍入误差可能存在。

有18个小数的标记可能(而且确实)有舍入错误。

EVM将floor (或舍入)取到最接近的整数。

提前知道这一点,开发人员可以适当而准确地进行数学计算。

代码语言:javascript
复制
// 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 <- -这是我使用的数字

票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/68401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档