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()
}
我可能在做一些愚蠢的事情,但我收到了错误
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()
}