首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BigNumber.js转换为/从每秒利率和年化利率。

使用BigNumber.js转换为/从每秒利率和年化利率。
EN

Ethereum用户
提问于 2021-03-31 02:17:44
回答 1查看 154关注 0票数 0

在MakerDao合同中,年化的百分比率和每秒的百分比率之间有转换.例如,他们的稳定费文档给出了这个示例:

如果稳定费设置为2%,它将累积为每秒1.00000000627937924910298109948‬%。在第一年年底,用户将完全欠本金的2%。

将年化格式转换为每秒格式(反之亦然)的基本方法如下所示,其中31536000是一年中的秒数:

1.0000000006279371924910298109948^31536000 = 2% 1.02^(1/31536000) =1.00000006279279371924910298109948%

由于稳健性只支持整数,因此可以使用定点算法在年化率和每秒汇率之间进行转换。My第一个问题:这两个速率的整数表示(以射线表示)是什么?

My的下一个问题是如何使用BigNumber.js实用程序将每秒/年化的汇率转换为-和--?

下面的JavaScript代码不起作用。

代码语言:javascript
复制
PER_SECOND_RATE.pow(toBN(SECONDS_IN_YEAR).toString())
ANNUALIZED_RATE.pow(toBN(-SECONDS_IN_YEAR).toString())
EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-03-31 20:34:07

Maker协议不使用或存储年率,也没有内部表示。

所有的速率都是每秒的,它使用的是RAY数格式,它是常规的uint256值,并且总是由特殊的数学函数处理,比如rmulrdiv,它们自动地将27个最右边的数字视为射线不动点数的十进制部分。

因此,1.02%的整数表示将是uint256值10000000006279371924910298109948

我试过使用BN.js,但这两种计算都不起作用,可能是因为所涉及的数字和指数的大小。

年化为每秒速率转换

对于使用javascript中的bc命令,有一种稍微有点麻烦的方法,对我来说效果很好。

函数的输入是年率。例: 5.6432%的bc输出小数点值和27小数位数。从输出中删除小数点,以获得智能契约使用的RAY格式的数字。

代码语言:javascript
复制
public async getRatePerSecond(annual: number) {
    let annRate = ((annual / 100) + 1).toFixed(4);
  
    const { stdout, stderr } = await exec(
      "bc -l <<< 'scale=27; e( l(" +
        annRate.toString() +
        ")/31557600 )'"
    );
  
    if (stderr) {
      console.error(`error: ${stderr}`);
      return;
    }
  
    let ratePerSec = BigNumber.from(
      stdout
        .toString()
        .replace(".", "")
        .replace(/(\r\n|\n|\r)/gm, "")
    );
  
    return ratePerSec;
  }

Ex:getRatePerSecond(2.75) = 1000000000859655594846036300

每秒转换成年化汇率换算

这并没有回答你的问题,但是我把这个python脚本留给其他人去寻找一种简单的计算方法,

代码语言:javascript
复制
$ python -c "print 1.000000000627507392906712186**31557600"

1.01999999956

如果您有兴趣了解更多信息,率机制介绍指南将介绍Maker协议中的费率。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/96452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档