Web3.js BigNumber 不适用于大幂指数

Web3.js BigNumber not working for large power exponent

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

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,然后我可以四舍五入,等等

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

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

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

这个很好用

const { toBn } = require('evm-bn')
const ethers = require('ethers')

const ToWei = (amount, decimals) => {
   return ethers.BigNumber
       .from(toBn(amount.toString(), decimals)._hex).toString()
}