javascript 错误:小数部分超出eithersJS中的小数

ppcbkaq5  于 2023-03-21  发布在  Java
关注(0)|答案(2)|浏览(192)

为什么下面的代码会返回小数部分的错误?它似乎只在低平衡时触发。
如果我的余额是0.1以太币或BNB,我不会看到错误,但如果我的余额是0.0001,我会看到这个错误

  • 错误:小数部分超过小数 *
var account = accounts[0]
var yourBalance = await provider.getBalance(account)
var fixedBalance= ethers.FixedNumber.fromValue(yourbalance , 18);
var stakedAmount = (fixedBalance * 0.50).toString();
var finalOutput = ethers.utils.parseUnits(stakedAmount , 18);  //this returns Error: fractional component exceeds decimals
yacmzcpb

yacmzcpb1#

使用toFixed(n)
var stakedAmount = (fixedBalance * 0.50).toFixed(6) ;
n定义为您需要的小数位的最大精度。
我任意选择了6,但这条评论表明你可能会上升到18?
toFixed(n)也会将您的数字转换为字符串,以便您可以删除toString()
我认为这是因为你的浮点数有太多的小数位,不能用BigNumber来表示,因此,你需要截断小数位的精度。
对于后人和通过搜索引擎来到这里的人,我收到的完整追溯是:

Error: fractional component exceeds decimals
 (fault="underflow", operation="parseFixed", code=NUMERIC_FAULT, version=bignumber/5.5.0)

这很有趣,因为我刚才也犯了类似的错误。在你之后的几个小时。
This issuethis issue和这个代码片段帮助我弄清楚了。

rekjcdws

rekjcdws2#

如果USDT支持6 decimals,而我的输入是153.60000000000002(超过6个十二位),则会导致上溢/下溢错误。
我是这样解决的:

// if USDT supports 6 decimals 
// and my input is 153.60000000000002 (more than 6 dec. places)
// it will cause overflow/underflow errors.
// this function trims too long decimals. 
function trim_decimal_overflow(n, decimals){
    n+=""

    if(n.indexOf(".") === -1) return n
    
    const arr = n.split(".");
    const fraction = arr[1] .substr(0, decimals);
    return arr[0] + "." + fraction;
}

相关问题