javascript BigNumber乘以以以太表示的十进制值

6rqinv9w  于 2023-01-16  发布在  Java
关注(0)|答案(2)|浏览(168)

我想用BigNumber的值来做math -100000 * 1.004,这里最大的问题是1.004是浮点数,BigNumber不接受,我用ethers.js库来做。
我试着使用parseUnits("1.004", 18)。我使用18,因为基本上我是在稳定的硬币价格上操作的。
我得到了BigNumber { value: "1004000000000000000" },为了做数学运算,我还必须解析100000,所以我用同样的方法-parseUnits("100000", 18),然后我只需要执行parseUnits("1.004", 18).mul(parseUnits("100000", 18)),把它们相乘,就得到了BigNumber { value: "100400000000000000000000000000000000000000" }
当我使用formatUnits()方法返回一个数字时,我得到了100400000000000000000000.0,正确的值应该是100000 * 1.004 = 100400
使用ethers.js库进行此类计算的正确方法是什么?

dluptydi

dluptydi1#

我最终决定使用bignumber.js库。ethers.js不支持带小数的浮点值,而bignumber.js在没有任何格式的情况下完美地做到了这一点。

u4dcyp6a

u4dcyp6a2#

将BigNumber转换为float,相乘,然后将结果转换为BigNumber:

import { BigNumber, ethers } from "ethers";

function mulBigNumbers(a: BigNumber, b: BigNumber): BigNumber {
    if (a == null || a.isZero() || b == null || b.isZero()) {
        return BigNumber.from(0);
    }

    const aFloat = parseFloat(ethers.utils.formatEther(a));
    const bFloat = parseFloat(ethers.utils.formatEther(b));

    if (isNaN(aFloat) || isNaN(bFloat)) {
        return BigNumber.from(0);
    }

    const resultFloat = aFloat * bFloat;

    return ethers.utils.parseEther(resultFloat.toFixed(18));
}

相关问题