0

How to convert token to full token without having any rounding errors.

     web3.utils.toBN(6221221111111110001).div(10**18).toFixed()

TypeError: num.isZero is not a function at BN.divmod (node_modules/number-to-bn/node_modules/bn.js/lib/bn.js:2329:17) at BN.div (node_modules/number-to-bn/node_modules/bn.js/lib/bn.js:2425:17) at Promise.all.then () at at process._tickCallback (internal/process/next_tick.js:182:7)

        bal=6221221111111110001/ (10**(18))

It also has some precision errors.

Any help is appreciated.

9
  • The error-message implies that you are using web3.utils.toBN, not web3.toBigNumber. Please clarify your question. Commented Dec 18, 2020 at 8:27
  • And the expression bal=balance/ (10**(18)) means nothing to us when we have no idea what bal and balance are. Please clarify that as well. Commented Dec 18, 2020 at 8:28
  • Also 12345 / 10 ** 15 is a value smaller than 1. If you plan to send it to a contract function, then you'll need to convert it to an integer, which means it's going to be a simple 0. So what exactly are you trying to do here? Also, how on earth is that related to bal=balance/ (10**(18)) at the end of the question? Commented Dec 18, 2020 at 8:34
  • @goodvibration Sorry for the typo.Updated the question Commented Dec 18, 2020 at 8:54
  • What do you mean "without having any rounding errors"? Function web3.utils.toBN.div gives you the integer division, do you want a regular division? You do realize that you will not be able to send the result to a contract function, right? In other words, it will be useful only on your offchain (Javascript) side. Commented Dec 18, 2020 at 8:56

1 Answer 1

1

First of all, regarding the specific error in your question, change this:

div(10**18)

To this:

divn(10**18)

Or to this:

div(web3.utils.toBN(10).pow(web3.utils.toBN(18)))

Second, since class BN supports only integer-arithmetic, the result of your computation is 6.

in order to perform non-integer computation, you will need to use class Decimal instead:

const Decimal = require('decimal.js');
const str = Decimal(6221221111111110001).div(Decimal(10).pow(18)).toFixed();

Or simply:

const str = Decimal('6221221111111110001e-18').toFixed();

Note that you will not be able to send this result to a contract function.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.