【问题标题】:Web3.js BigNumber 不适用于大幂指数
【发布时间】:2022-01-08 12:36:33
【问题描述】:

我可能在做一些愚蠢的事情,但我得到了错误

Uncaught (in promise) Error: Assertion failed,特别是它在 BN.js 内部检查的地方:

function assert (val, msg) {
    if (!val) throw new Error(msg || 'Assertion failed');
}

下面是我的代码。我收到一个 29 次方的数字,即小数点后 18 位,我想将其转换为类似于 wei 和 eth 的“非小数”数字:

const post_response_2 = await fetch('/balanceOf-TKN-by-addr', {method: 'POST', body: stringify_post_input, headers: { "content-type": "application/json" } });
var TKN_balance_response = await post_response_2.json(); 
console.log(TKN_balance_response);
var TKN_BN = await new BN(TKN_balance_response).toString();      //line giving error
var TKN_balance = await web3.utils.fromWei(TKN_BN, 'ether');
console.log("TKN_balance :: "+String(TKN_balance));

在我的服务器端,我得到了988699999999999976500000000000 的响应,在上面的客户端console.log 中,我看到了9.886999999999999e+29

BN.js 我做错了什么?

编辑

由于有 18 位小数,我希望我的 console.log 的答案是 988699999999.999976500000000000,然后我可以四舍五入,等等。

【问题讨论】:

    标签: ethereum web3 web3js


    【解决方案1】:

    BN.js 不接受指数形式的值(在您的情况下为 9.886999999999999e+29)。

    您可以使用 .toLocaleString() 本机函数将指数形式转换为表示完整数字的字符串。

    // type `Number`
    const TKN_balance_response = 9.886999999999999e+29;
    // type `string`
    const TKN_balance_response_string = TKN_balance_response.toLocaleString('fullwide', {useGrouping:false});
    var TKN_BN = await new BN(TKN_balance_response_string).toString();
    console.log(TKN_BN);
    

    打印

    988699999999999900000000000000
    

    一个更简洁的解决方案是从/balanceOf-TKN-by-addr端点返回(大数字)值已经作为一个字符串(我根据上下文的猜测是它作为一个数字返回或者它被json()函数转换为数字)。然后你可以将它按原样传递给BN.js 构造函数:

    const TKN_balance_response = '988699999999999976500000000000';
    var TKN_BN = await new BN(TKN_balance_response).toString();
    

    【讨论】:

    • 哇,非常感谢!对于另一个问题:))
    猜你喜欢
    • 2019-03-25
    • 2022-07-20
    • 2019-07-19
    • 2019-12-18
    • 2018-09-04
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多