我正在尝试创建一个方法,为Ruby中的Fibonacci检测方法生成一个true或false返回值



我正试图创建一个方法,当一个数字作为参数来检测该数字是否是斐波那契序列时,该方法会生成一个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浮点,因此失去了精度。大数学仍然应该为你做这件事。

最新更新