You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby Exercism练习:实现储蓄账户达标年数的until循环问题求助

问题分析与修复方案

核心问题拆解

你的代码主要存在三个关键问题,导致无法得到正确结果:

  1. 浮点数精确比较陷阱:用current_balance == desired_balance判断终止条件完全不可行——浮点数运算存在精度误差,比如200.75经过14次0.5%复利计算后,实际结果是≈214.88,但底层存储的是类似214.8799999999999的近似值,永远不会精确等于目标值,循环要么卡死要么提前错误返回。
  2. 利率未动态更新:你只在初始时计算了一次利率,但余额增长跨过1000、5000这些阈值时,利率会变化,必须每年重新计算当前余额对应的利率。
  3. 循环逻辑错误:正确的终止条件应该是当前余额大于等于目标余额(当目标高于当前时),而非精确相等,我们需要的是「最小达标年数」,只要余额达标就停止。

修复后的代码

直接复用你已实现的annual_balance_update方法(避免重复逻辑),修正循环逻辑:

module SavingsAccount
  def self.interest_rate(balance)
    if balance < 0
      3.213
    elsif balance >= 5000
      2.475
    elsif balance >= 1000
      1.621
    else
      0.5
    end
  end

  def self.annual_balance_update(balance)
    rate = interest_rate(balance) / 100
    balance * (1 + rate)
  end

  def self.years_before_desired_balance(current_balance, desired_balance)
    return 0 if current_balance >= desired_balance

    years = 0
    current = current_balance

    until current >= desired_balance
      current = annual_balance_update(current)
      years += 1
    end

    years
  end
end

关键优化点说明

  1. 复用已有方法:直接调用annual_balance_update更新年度余额,自动处理了利率的动态计算,既减少重复代码,也避免手动计算利率时的错误。
  2. 修正终止条件:用current >= desired_balance替代精确相等,彻底解决浮点数精度问题,只要余额达标就停止循环。
  3. 边界情况处理:先判断当前余额是否已经达标,直接返回0,避免不必要的循环。
  4. 简化interest_rate逻辑:调整条件顺序,把负数余额的判断放在最前面,逻辑更清晰,也避免冗余的else分支。

测试验证

运行你的测试用例:

SavingsAccount.years_before_desired_balance(200.75, 214.88)
#=> 14

结果符合预期。

内容的提问来源于stack exchange,提问作者d709859

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:30:29