跳到内容
🛠️ToolsShed

债务滚雪球计算器

使用雪球法或雪崩法规划债务还款,包含还款时间表。

关于此工具

债务滚雪球计算器帮助您使用滚雪球或雪崩方式为多笔债务制定战略性还款计划。许多人面临多笔债务,发现面对庞大的总余额时很难保持动力。本工具提供了一份月度路线图,清楚地显示每笔债务何时还清,以及通过支付超过最低还款额的额外付款可以节省多少利息。

要使用计算器,请列出所有债务及其当前余额、每月最低还款额和利率,然后设置您的每月总还款预算。计算器会根据您选择的策略重新排序您的债务——滚雪球方式首先优先处理最小余额以获得心理动力,而雪崩方式针对最高利率以最小化应付总利息。几秒钟内,您将看到完整的还款时间表、总利息以及已清偿债务为下一个目标债务释放资金的月度滚雪球效应。

滚雪球方式通常具有更高的完成率,因为早期的胜利建立了情感动力,而雪崩方式在数学上可以节省最多的钱。如果动力是您的挑战,请选择滚雪球;如果您财务上很有纪律,请选择雪崩。请记住,计算器假设利率固定且严格遵守还款计划;实际上,您可能需要调整新的费用或生活变化。将其用作激励路线图而不是精确的合同,如果您的债务情况感到压力很大,请考虑咨询信用顾问。

常见问题

代码实现

from dataclasses import dataclass, field
from typing import List, Optional

@dataclass
class Debt:
    name: str
    balance: float
    min_payment: float
    apr: float  # Annual Percentage Rate e.g. 0.20 for 20%

    @property
    def monthly_rate(self) -> float:
        return self.apr / 12

@dataclass
class PayoffResult:
    name: str
    months_to_payoff: int
    total_paid: float
    total_interest: float

def debt_snowball(debts: List[Debt], monthly_budget: float) -> List[PayoffResult]:
    """
    Simulate the debt snowball method.
    Debts are sorted by balance (smallest first).
    Extra budget is applied to the current target debt.
    """
    # Sort by balance ascending (snowball)
    queue  = sorted(debts, key=lambda d: d.balance)
    paid   = [False] * len(queue)
    bals   = [d.balance for d in queue]
    totals = [0.0] * len(queue)  # total paid per debt
    month  = 0
    results = []

    while any(not p for p in paid):
        month += 1
        # Find current target: first unpaid debt
        target_idx = next(i for i, p in enumerate(paid) if not p)

        # Calculate total minimums for non-target debts
        minimums_used = sum(
            queue[i].min_payment for i in range(len(queue))
            if not paid[i] and i != target_idx
        )
        extra = monthly_budget - minimums_used

        # Apply payments
        for i, debt in enumerate(queue):
            if paid[i]:
                continue
            payment = extra if i == target_idx else debt.min_payment
            interest = bals[i] * debt.monthly_rate
            principal = min(payment - interest, bals[i])
            bals[i] -= principal
            totals[i] += payment
            if bals[i] <= 0.01:
                paid[i] = True
                results.append(PayoffResult(
                    name=debt.name,
                    months_to_payoff=month,
                    total_paid=totals[i] + bals[i],  # adjust overpayment
                    total_interest=totals[i] - debt.balance
                ))

    return results

# Example
debts = [
    Debt("Credit Card A", balance=2500,  min_payment=75,  apr=0.22),
    Debt("Credit Card B", balance=5000,  min_payment=100, apr=0.18),
    Debt("Car Loan",      balance=8000,  min_payment=200, apr=0.06),
    Debt("Student Loan",  balance=15000, min_payment=150, apr=0.05),
]

results = debt_snowball(debts, monthly_budget=700)

total_interest = sum(r.total_interest for r in results)
print("Debt Snowball Payoff Plan:")
print(f"{'Debt':<20} {'Months':>7} {'Interest Paid':>14}")
for r in results:
    yrs = r.months_to_payoff // 12
    mos = r.months_to_payoff % 12
    print(f"{r.name:<20} {yrs}y {mos:02d}m  ${r.total_interest:>12,.2f}")
print(f"{'Total interest:':<20}        ${total_interest:>12,.2f}")

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.