Blockchain 如何计算区块链稳健性的PMT函数(财务函数)
如何转换此代码(javascript代码) 转化为坚固性代码,它会起作用吗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
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的参数:
所以我还是得到了浮点值。你最好的办法是将所有值乘以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