首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在调用契约getter时为公共uint256返回的对象而不是整数

在调用契约getter时为公共uint256返回的对象而不是整数
EN

Ethereum用户
提问于 2021-05-25 19:12:31
回答 1查看 1.2K关注 0票数 0

我的应用程序调用一个公共方法从与value的合同中检索ethers 5.1。以下是代码:

代码语言:javascript
复制
                let contractValue = await contract_forsale.value();  //value is a public getter
                console.log("contractValue in deal : ", contractValue); //<<==an object returned
                console.log("escrow is : ", escrow);  //<<==33
                console.log(" contractValue != escrow ", contractValue != escrow)  //<<==false

以下是控制台输出:

代码语言:javascript
复制
 contractValue in deal :  {"hex": "0x21", "type": "BigNumber"}  //<<==shall be 33. why obj is returned???
 LOG  escrow is :  33  
 LOG   contractValue != escrow  false  //<<== false???

我不太明白为什么返回的是一个对象而不是一个整数。在这里,contractValue != escrow是日志输出中的false,这让人感到困惑。因为返回的contractValue是一个对象,而escrow是整数,所以它们不应该相等(从求值中为true)。

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-05-25 20:35:00

许多人在处理Ethereum时遇到的第一个问题是数字的概念。大多数普通货币的粒度很小。例如,一美元只有100美分。然而,在一个乙醚中有1018个魏。

JavaScript使用IEEE754双精度二进制浮点数字来表示数值。因此,在9,007,199,254,740,991之后的整数集中存在漏洞,这对ether来说是个问题,因为它只有大约0.009以太(在wei中),这意味着超过它的任何值都将开始出现舍入误差。

要演示这如何成为代码中的一个问题,请考虑:

代码语言:javascript
复制
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
// false

为了弥补这一点,所有数字(可以是大的)都以BigNumbers的形式存储和操作。

parseEther(etherString)formatEther(wei)函数可用于在显示给用户或由用户输入的字符串表示和可以安全处理数学操作的大数表示之间进行转换。

比较BigNumbers

因为当您比较JavaScript中的对象时,它会比较引用。这就是为什么您可以做contractValue == escrow而不是contractValue.eq(escrow)的原因。对于!=,您可以使用!contractValue.eq(escrow)

有关更多方法,您可以查看医生来了

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

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

复制
相关文章

相似问题

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