title: Ethers.js BigNumber mul method returns unexpected answer past 18 decimals
body: <p>I'm working on a bot that tracks the price of an invested asset in WBNB, so I implemented a function that checks the balance of this asset, then multiplies it by its price. The issue is that it is not differentiating between decimal places:</p>
  <pre><code>  const tokenBalance = (await token.functions.balanceOf(address))[0];
  
    let tokenOut = addresses.WBNB,
      tokenIn = contractAddress;
  
    // 1 custom token
    const amountIn = tokens(&quot;1&quot;);
  
    // how much is 1 custom token in WBNB
    const amounts = await router.getAmountsOut(amountIn, [tokenIn, tokenOut]);
  
    const result = amounts[1].mul(tokenBalance).toString();
    console.log(ethers.utils.formatEther(result));
    // 1680242782775341.15960160560224 (it would be great to have this much BNB, but this is the error)
  </code></pre>
  <p>The result is fine, but it doesn't calculate the right decimal places. For example, if I calculate 1% of this amount, I get:</p>
  <p><code>1680242769310983.64248382760988</code></p>
  <p>How can I get an accurate result?</p>