这个Ruby代码中的模数运算符有什么问题?

时间:2014-12-23 22:21:12

标签: ruby modulus

def factors_to_three (n)
  puts n

  if n % 3 == 0
    puts "Your number is divisible by 3"
  else
    puts "Your Number is NOT divisible by 3"
  end
end

puts "Enter the number to check if its divisible by 3"
number = gets.chomp
factors_to_three(number)

无论我输入什么号码,我的节目总是会输出Your Number is NOT divisible by 3,即使是明确的。

3 个答案:

答案 0 :(得分:3)

n不是整数。 gets()返回一个字符串,chomp删除换行符,但数据仍然是一个字符串。

"6" % 3 != 0
6 % 3 == 0

您需要将传入数据转换为整数表示。

答案 1 :(得分:2)

使用gets读取文本时,会以字符串形式读入。因此,在您的代码中,number实际上不是数字,而是字符串。因此,"模数"运算符实际上不是模数运算符,而String上的格式运算符String#%

  

格式 - 使用str作为格式规范,并返回将其应用于arg的结果。如果   格式规范包含多个替换,然后是arg   必须是包含要替换的值的数组或哈希。看到   Kernel :: sprintf有关格式字符串的详细信息。

"%05d" % 123                              #=> "00123"
"%-5s: %08x" % [ "ID", self.object_id ]   #=> "ID   : 200e14d6"
"foo = %{foo}" % { :foo => 'bar' }        #=> "foo = bar"

如您所见,此方法返回一个不等于零的字符串。因此,该程序总是会说该数字可被3整除,即使它是。

您可以通过在to_i

返回的输入上调用get来解决此问题
number = gets.chomp.to_i

答案 2 :(得分:2)

您的结果将始终为false,因为gets.chomp会返回字符串:

number = gets.to_i

上面的代码可以使用,但您必须始终键入一个整数。有更好的方法来管理检查输入是否有效。

所以你可以先检查一下:

number = gets
factors_to_three(number.to_i) if number.is_a?(Integer)