Appearance
实现 投资回报 ROI/IRR 工具
分类:general | 标签:ROI、IRR、投资 计算 ROI 与 IRR 内部收益率
2.1 功能说明
计算 ROI 与 IRR 内部收益率
2.1.1 使用指南
功能说明
输入初始投资与后续各期现金流,计算总回报率(ROI)与内部收益率(IRR,按年复利)。IRR 通过二分法求解使净现值为 0 的折现率。
使用场景
投资评估、项目回报测算。
2.2 代码实现
2.2.1 组件结构
本工具是一个基于 Vue 3 <script setup> 语法的单文件组件(SFC),统一包裹在 ToolPageShell 组件内,由它提供页面标题、工具 ID、分类与「使用指南」插槽等通用外壳;核心业务逻辑(响应式状态、计算属性、事件处理函数)全部写在 <script setup> 中,输入/输出通过 el-input、el-button 等 Element Plus 组件与用户交互,所有数据均在浏览器本地处理,不会上传服务器。
2.2.2 核心逻辑概览
<script setup> 中定义的主要函数/方法:
npv()run()clear()
2.2.3 关键实现代码
以下是该工具的完整 <script setup> 实现(核心代码)。模板(<template>)与样式(<style>)已省略。
vue
import { ref } from 'vue'
import ToolPageShell from '@/components/ToolPageShell.vue'
const flows = ref('')
const error = ref('')
const result = ref(null)
function npv(rate, arr) {
return arr.reduce((s, cf, t) => s + cf / Math.pow(1 + rate, t), 0)
}
function run() {
error.value = result.value = null
const arr = flows.value.split('\n').map(s => s.trim()).filter(Boolean).map(Number)
if (arr.length < 2 || arr.some(isNaN)) { error.value = '请输入至少两期有效数字现金流'; return }
const invest = -arr[0]
if (invest <= 0) { error.value = '首期应为投入(负数)'; return }
const totalReturn = arr.reduce((s, v) => s + v, 0)
const roi = (totalReturn / invest * 100).toFixed(2)
// IRR bisection
let lo = -0.9999, hi = 10
let irr = '无法收敛'
if (npv(lo, arr) * npv(hi, arr) < 0) {
for (let i = 0; i < 100; i++) {
const mid = (lo + hi) / 2
const v = npv(mid, arr)
if (Math.abs(v) < 1e-6) { irr = (mid * 100).toFixed(2) + '%'; break }
if (npv(lo, arr) * v < 0) hi = mid; else lo = mid
}
if (irr === '无法收敛') irr = ((lo + hi) / 2 * 100).toFixed(2) + '%'
}
result.value = { roi, profit: totalReturn.toFixed(2), irr }
}
function clear() { flows.value = error.value = result.value = '' }2.3 效果截图
