我正试图创建一个方法,当一个数字作为参数来检测该数字是否是斐波那契序列时,该方法会生成一个true或false返回值,尽管我从未遇到过这样的数字:
2.073668380220713e+21.
请原谅我的无知,但有没有一种方法可以处理ruby中的这种类型的值,使其在下面的方法中工作?
def is_fibonacci?(num)
high_square = Math.sqrt((5 * num) * num + 4)
low_square = Math.sqrt((5 * num) * num - 4)
# If high_square or low_square are perfect squares, return true, else false.
high_square == high_square.round || low_square == low_square.round ? true : false
end
puts is_fibonacci?(927372692193078999171) # Trying to return false, but returns true. The sqrt of this number is 2.073668380220713e+21.
puts is_fibonacci?(987) # Returns true as expected.
我相信,因为它是一个很大的数字,Ruby将其显示为科学符号,而不能在您的is_fibonacci中工作?方法和基本的数学库。
您可能想研究一下在Ruby中使用BigMath库http://ruby-doc.org/stdlib-1.9.3/libdoc/bigdecimal/rdoc/BigMath.html
编辑正如Niel所指出的,它是一个Ruby浮点,因此失去了精度。大数学仍然应该为你做这件事。