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
相关产品推荐
相关产品推荐

