我正试图检查一个数字是否是一个完美的正方形。
这是我的代码:
def is_square(x)
return true if
math.sqrt(x).is_a? Integer
end
知道为什么它不起作用?
答案 0 :(得分:3)
Math
,这是为数学运算设计的恒定控制模块。Math.sqrt(9)
也会返回浮动,所以这也不会起作用。但您可以通过1
检查除法的余数。 总结一下,我会做这样的事情:
def is_square?(x)
(Math.sqrt(x) % 1).zero?
end
答案 1 :(得分:2)
结果是浮动:
Math.sqrt(4)
# => 2.0
Math.sqrt(4).class
# => Float
您需要检查结果是否是没有小数点的数字:
def is_square(x)
Math.sqrt(x) % 1 == 0
end
答案 2 :(得分:1)
首先,您需要将math
大写为Math
。
此代码的另一个问题是Math.sqrt
的返回值。假设您提供4
作为x
的值。 Math.sqrt
总是返回一个Float(十进制),即使Float恰好是一个整数,结果也是2.0
。就Ruby而言,以及大多数编程语言,2.0
不是整数。它仍然是一个Float,只是一个没有任何小数部分。
检查Float是否为整数的最简单方法是将其修改为1(即将其除以1得到余数),这可以使用%
来完成,然后检查这个余数为0。
def is_square(x)
return true if Math.sqrt(x) % 1 == 0
end
此功能仍然不完美;对于正方形,它返回true
,对于非正方形,返回nil
。将false
替换为非正方形更有意义。
这可以通过删除if
并简单地返回条件的结果来完成。此外,块的最后一个语句不需要Ruby中的return
。
def is_square(x)
Math.sqrt(x) % 1 == 0
end
答案 3 :(得分:0)
<router-outlet>
的结果永远不会是整数类型,即使对于完美的正方形也是如此。通常,类型检查在Ruby中不是很有用。
相反,您可以使用几种策略来确定Ruby中的数字是否为整数。
Math#sqrt
x == x.to_int
x.denominator == 1
顺便说一句,惯用Ruby也不使用像x % 1 == 0
这样的前缀,而是在谓词方法中添加后缀问号:
is_
答案 4 :(得分:0)
从Ruby 2.5开始,Integer类具有sqrt,它返回整数平方根。
def is_square?(x)
Integer.sqrt(x) ** 2 == x
end