#ethereum #web3 #web3js
#эфириум #web3 #web3js
Вопрос:
Я, вероятно, делаю что-то глупое, но я получаю ошибку
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
и в клиентской консоли.бревно выше, я вижу 9.886999999999999e 29
.
Что я делаю не так BN.js
?
Редактировать
Поскольку существует 18 знаков после запятой, я ожидаю ответа на этот вопрос, который я утешаю.журнал должен быть 988699999999.999976500000000000
, тогда я смогу его округлить и т. Д.
Ответ №1:
BN.js не принимает значения в экспоненциальной форме (в вашем случае 9.886999999999999e 29
).
Вы можете преобразовать форму expenential в строку, представляющую полное число, используя .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();
Комментарии:
1. Вау, сработало отлично, спасибо! По другому вопросу тоже :))