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

Ruby判断整数是否为平方数代码报错:Math::DomainError求助

解决判断平方数代码的DomainError问题

你的代码在处理非负数时逻辑是有效的,但遇到负数时直接触发了Math.sqrt的定义域错误——因为实数范围内的平方根函数不接受负数作为输入,这就是测试-1时报错的核心原因。

快速修复方案

只需要先给负数加一个边界判断,直接返回false(毕竟负数不可能是整数的平方),修改后的代码如下:

def is_square(x)
  # 负数直接返回false,避免调用sqrt报错
  return false if x < 0
  Math.sqrt(x).to_r.denominator == 1
end

这个修改能完美覆盖所有测试用例:

  • -1 → 直接返回false,不会触发sqrt调用
  • 0 → Math.sqrt(0)是0,转成有理数后分母为1,返回true
  • 正数的逻辑和你原来的代码一致,依然能通过之前的随机测试

备选方案(规避浮点精度潜在问题)

如果担心超大整数的浮点平方根精度偏差,也可以用整数反向验证的方式实现:

def is_square(x)
  return false if x < 0
  root = Math.sqrt(x).to_i
  # 验证整数根的平方是否等于原数,处理浮点取整的误差
  root * root == x || (root + 1) * (root + 1) == x
end

这个方法通过取平方根的整数部分,再反向计算平方结果进行验证,能避免浮点转有理过程中可能出现的精度问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 07:27:43