Skip to content

实现 投资回报 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-inputel-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 效果截图

投资回报 ROI/IRR 效果截图

工具访问地址:https://www.i91tools.com/tools/roi-irr