- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很早就开始构建一个应用程序,该应用程序可以在许多场景中用作电子表格的替代品。它为用户提供了一种非表格方法来创建和组织分析。用户的指令被转译为 Javascript 并由 Javascript 执行(仅使用纯函数)。 (该接口(interface)介于 Google Blockly 和文本编辑器中的直接编码之间。)该产品使用 Javascript 数组来代替您通常在电子表格中使用的单元格范围。我使用这种方法面临的一个问题是(准)循环计算,例如在简单的摊销计划中发现的问题。
到目前为止,我尝试解决该问题(未成功)涉及:
下面我将提供足够的背景信息来说明这个问题,这可以进行相当广泛的推断。以抵押贷款摊销时间表为例:
基本上,BOP(“期初”)余额取决于上一期间的 EOP(“期末”)余额。期末余额取决于同期国际收支平衡表余额。在使用连续单元格范围的电子表格中,这不是循环的,因为每个 BOP 余额和 EOP 余额都是离散单元格。但是,如果 BOP 余额和 EOP 余额(以及所有其他基于时间序列的计算)是数组,则在尝试检索元素时会出现循环引用。帖子末尾提供了该示例的电子表格屏幕截图作为补充。
尝试在我的应用程序中构建此分析会生成以下 JS(为了清晰起见,我对其进行了编辑和重新组织)。如果将这段代码转换为电子表格,则可以正常工作(请参阅帖子末尾的补充屏幕截图):
// Credit: Apache OpenOffice
function payment (rate, periods, present_value, future_value, type) {
var fv = future_value || 0
var t = type || 0
if (rate === 0) {
return -1 * ((present_value + fv) / periods)
} else {
var term = (1 + rate) ** periods // Transpiling with Babel; otherwise, use Math.pow(1 + rate, periods)
if (t === 1) {
return -1 * ((fv * rate / (term - 1) + present_value * rate / (1 - 1 / term)) / (1 + rate))
} else {
return -1 * (fv * rate / (term - 1) + present_value * rate / (1 - 1 / term))
}
}
}
var loan_principal = 1000000
var annual_interest_rate = 0.06
var interest_rate_monthly = annual_interest_rate / 12
var amortization_period_years = 25
var amortization_period_months = amortization_period_years * 12
var months_range = _.range(1, amortization_period_months + 1, 1) // See: http://underscorejs.org/#range [1, 2, 3, ... 298, 299, 300]
var bop_balance = months_range.map(function (current_element, current_list_position) {
if (current_list_position === 0) {
return loan_principal
} else {
// Along with eop_balance, this causes a graph cycle
return eop_balance[current_list_position - 1]
}
})
var monthly_payment = months_range.map(function (current_element, current_list_position) {
return payment(interest_rate_monthly, amortization_period_months, loan_principal)
})
var principal_payment = months_range.map(function (current_element, current_list_position) {
var current_mthly_pmt = monthly_payment[current_list_position]
var current_int_pmt = interest_payment[current_list_position]
return current_mthly_pmt - current_int_pmt
})
var interest_payment = months_range.map(function (current_element, current_list_position) {
if (current_list_position === 0) {
return loan_principal * interest_rate_monthly * -1
} else {
var previous_bal = eop_balance[current_list_position - 1]
return previous_bal * interest_rate_monthly * -1
}
})
var eop_balance = months_range.map(function (current_element, current_list_position) {
// This causes a graph cycle
var cur_bal = bop_balance[current_list_position]
var cur_prin_pmt = principal_payment[current_list_position]
return cur_bal + cur_prin_pmt
})
由于bop_balance和eop_balance之间存在循环,这段代码不会进行拓扑排序。由于循环引用,它不会完全评估。
关于如何解决这种一般情况有什么建议吗?谢谢。
补充信息:
应用程序中对纯函数的依赖是为了尽量减少使用电子表格的用户的困惑。
如果查看实际应用程序有助于提供背景信息,请随时访问 https://www.getpinevale.com 。我把它放在最后,这样就不会分散对问题的注意力。
最佳答案
你不应该做双链接结构。我建议使用简单的 for 循环并构建两个数组。
for(int i=0; i<range.length;i++){
if(i==0){
bop_balance[i]= loan_principal;
eop_balance[i]= somecalculatedamount(loan_principal);
}else{
bop_balance[i] = eop_balance[i-1];
eop_balance[i] = somecalculatedamount(bop_balance[i])
}
}
我不知道我的功能是否正确,但我想要表达的要点是:
根据下面的评论,我建议使用reduce。
let range = [1,2,3,4];
let output = range.reduce(function(accumulator, currentValue, currentIndex) {
let balance = {};
if (currentIndex == 0) {
balance.bop = 0;
balance.eop = currentValue;
}else{
balance.bop = accumulator[currentIndex-1].eop;
balance.eop = balance.bop+5;
}
accumulator.push(balance);
return accumulator;
}, []);
console.log(output);
关于涉及数组的Javascript循环计算(示例: amortization schedule),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48694524/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 4 年前。 Improve
目前我正在努力解决以下问题: 我有两个表(契约(Contract)表和摊销表)。 契约(Contract):未清金额的契约(Contract)信息 摊销:付款日期和摊销金额 我想要的结果是一张包含契约
我很早就开始构建一个应用程序,该应用程序可以在许多场景中用作电子表格的替代品。它为用户提供了一种非表格方法来创建和组织分析。用户的指令被转译为 Javascript 并由 Javascript 执行(
我想使用 javamoney 制作贷款摊销表。我想过使用 PresentValueOfAnnuityPayment 但在 javamoney 1.3 中找不到它。有什么建议吗? 编辑:我在项目中添加了
我满足于 O(log n) 第一次操作来找到我的起点 NavigableMap navlevel = new TreeMap<>(); 但是在手写的 C++(或者我想是手写的 Java)中,一旦我发现
我是一名优秀的程序员,十分优秀!