我的应用程序调用一个公共方法从与value的合同中检索ethers 5.1。以下是代码:
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以下是控制台输出:
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)。
发布于 2021-05-25 20:35:00
许多人在处理Ethereum时遇到的第一个问题是数字的概念。大多数普通货币的粒度很小。例如,一美元只有100美分。然而,在一个乙醚中有1018个魏。
JavaScript使用IEEE754双精度二进制浮点数字来表示数值。因此,在9,007,199,254,740,991之后的整数集中存在漏洞,这对ether来说是个问题,因为它只有大约0.009以太(在wei中),这意味着超过它的任何值都将开始出现舍入误差。
要演示这如何成为代码中的一个问题,请考虑:
(Number.MAX_SAFE_INTEGER + 2 - 2) == (Number.MAX_SAFE_INTEGER)
// false为了弥补这一点,所有数字(可以是大的)都以BigNumbers的形式存储和操作。
parseEther(etherString)和formatEther(wei)函数可用于在显示给用户或由用户输入的字符串表示和可以安全处理数学操作的大数表示之间进行转换。
因为当您比较JavaScript中的对象时,它会比较引用。这就是为什么您可以做contractValue == escrow而不是contractValue.eq(escrow)的原因。对于!=,您可以使用!contractValue.eq(escrow)。
有关更多方法,您可以查看医生来了。
https://ethereum.stackexchange.com/questions/99660
复制相似问题