Blockchain 如何计算区块链稳健性的PMT函数(财务函数)

Blockchain 如何计算区块链稳健性的PMT函数(财务函数),blockchain,solidity,financial,Blockchain,Solidity,Financial,如何转换此代码(javascript代码) 转化为坚固性代码,它会起作用吗 function pmt(rate_per_period, number_of_payments, present_value, future_value){ if(rate_per_period != 0.0){ // Interest rate exists var q = Math.pow(1 + rate_per_period, number_of_payments); return (r

如何转换此代码(javascript代码) 转化为坚固性代码,它会起作用吗

function pmt(rate_per_period, number_of_payments, present_value, future_value){
if(rate_per_period != 0.0){
    // Interest rate exists
    var q = Math.pow(1 + rate_per_period, number_of_payments);
    return (rate_per_period * (future_value + (q * present_value))) / ((q-1) * (1 + rate_per_period ));

} else if(number_of_payments != 0.0){
    // No interest rate, but number of payments exists
    return -(future_value + present_value) / number_of_payments;
}

return 0;}
已执行此功能:

function PMT(uint _rate,uint256 _term,uint _pv) public view returns (uint)
{
     uint q = ((1 + _rate) ** _term);
    return (_rate *  (((1 + _rate) ** _term) * _pv)) / ((((1 + _rate) ** _term)-1) * (1+_rate));
}
那么,我如何表示十进制数值的实度呢? 固定点数还没有完全得到稳定度的支持。 它们可以声明,但不能分配给或从

例如,功能参数:

pmt(0.0025,12,700000);
*************编辑

乘法功能不起作用

PMT的参数:

  • 资金总额(700000)
  • 总月数(12)
  • 总年数(1)
  • 年收益率利息(3%-0.03)
  • 如果我通过10**2=100给他们供电 参数将为

  • 资金总额(70000000)
  • 总月数(1200)
  • 总年数(100)
  • 年收益率利息(3%-0.03-3)
  • 在开始计算PMT函数之前,我必须计算他得到的参数:

  • 资金总额:700万
  • 速率:3/1200-0.0025(通过上述参数)
  • 总月份:12

  • 所以我还是得到了浮点值。

    你最好的办法是将所有值乘以10的幂,这样你就不再有浮点数了。然后进行计算,并将结果值除以合同外的
    10**位小数

    这与各种代币用于跟踪余额的方法相同。

    您可以使用库。它具有您需要的所有功能(
    add
    sub
    mul
    div
    neg
    pow
    ),并使用固定点数进行操作。注意,这是使用二进制而不是十进制定点,点后有64位二进制数字。所以,为了将十进制数转换成二进制定点,基本上需要将它乘以2^64。要从定点转换为十进制,只需除以2^64即可

    使用此库,可以将Javascript函数移植到Solidity,如下所示:

    功能pmt(
    int128每周期费率,int128付款数量,
    int128当前值、int128未来值)公共纯返回(int128){
    if(每周期费率!=0){
    //利率存在
    int128 q=
    ABDKMath64x64.pow(
    ABDKMath64x64.add(
    0x1000000000000000,
    每个周期的费率),
    ABDKMath64x64.toUInt(
    支付的数量);
    返回
    ABDKMath64x64.div(
    ABDKMath64x64.mul(
    每个周期的费率,
    ABDKMath64x64.add(
    未来价值,
    ABDKMath64x64.mul(
    Q
    现值),
    ABDKMath64x64.mul(
    ABDKMath64x64.sub(
    Q
    0x100000000000000),
    ABDKMath64x64.add(
    0x1000000000000000,
    每个周期的费率);
    }else if(付款数量!=0){
    //没有利率,但存在付款数量
    返回
    ABDKMath64x64.div(
    ABDKMath64x64.neg(
    ABDKMath64x64.add(
    未来价值,
    现值),
    付款数量);
    }否则返回0;
    }
    
    请注意,
    1
    变成了
    0x1000000000000000
    ,即2^64。在将所有参数传递给此函数之前,需要将所有参数乘以2^64,在使用之前,需要将结果除以2^64

    我刚刚用以下参数在Remix中尝试了这个Solidity函数:

    rate_per_period = 0.03    // = 0x7AE147AE147AE14 / 2^64
    number_of_payments = 10.0 // = 0xA0000000000000000 / 2^64
    present_value = 1.0       // = 0x10000000000000000 / 2^64
    future_value = 2.0        // = 0x20000000000000000 / 2^64
    

    它返回了我
    0.2832
    =0x487F82986F5A14DC/2^64
    ),这与Javascript函数返回的这些参数相同。

    我用结果编辑了这篇文章,请查看复利
    月利率=(1+年利率)^(1/12)-1
    ,而不是
    年利率/12