带有“repeated_permutation”和浮点数的行为
Behaviour with `repeated_permutation` and floating points
我正在解决 Project Euler 问题 33。
(10..99).to_a.repeated_permutation(2) do |ary|
print (ary[0]/ary[1]).to_f if ary[0]/ary[1] < 1
end
returns 只不过是一系列小数位和零。但是,如果我获取数组的值并手动划分它们,例如:
print 98/99.to_f
返回了正确的值。
谁能解释为什么会发生这种情况,以及(更重要的是)如何避免这种情况?
ary[0]
和 ary[1]
都将在您的块中始终为正整数。这意味着 ary[0]/ary[1]
将是 0
或某个正整数。当 ary[0]/ary[1]
小于一时(即当 ary[0]/ary[1]
不为零时),您的块什么都不做。因为你只在 ary[0]/ary[1] == 0
时调用 print
,你实际上只是在说:
print 0.to_f if ary[0]/ary[1] == 0
这个:
print 98/99.to_f
打印出你期望的内容,但你并没有在块中这样做,你说的是:
print (98/99).to_f
我们发现 to_f
调用的位置不对。
你可能想说:
print ary[0]/ary[1].to_f if ary[0]/ary[1] < 1
获得浮点除法而不是整数除法。
我正在解决 Project Euler 问题 33。
(10..99).to_a.repeated_permutation(2) do |ary|
print (ary[0]/ary[1]).to_f if ary[0]/ary[1] < 1
end
returns 只不过是一系列小数位和零。但是,如果我获取数组的值并手动划分它们,例如:
print 98/99.to_f
返回了正确的值。
谁能解释为什么会发生这种情况,以及(更重要的是)如何避免这种情况?
ary[0]
和 ary[1]
都将在您的块中始终为正整数。这意味着 ary[0]/ary[1]
将是 0
或某个正整数。当 ary[0]/ary[1]
小于一时(即当 ary[0]/ary[1]
不为零时),您的块什么都不做。因为你只在 ary[0]/ary[1] == 0
时调用 print
,你实际上只是在说:
print 0.to_f if ary[0]/ary[1] == 0
这个:
print 98/99.to_f
打印出你期望的内容,但你并没有在块中这样做,你说的是:
print (98/99).to_f
我们发现 to_f
调用的位置不对。
你可能想说:
print ary[0]/ary[1].to_f if ary[0]/ary[1] < 1
获得浮点除法而不是整数除法。