ruby可以有一个以浮点数开始的范围吗?

ruby可以有一个以浮点数开始的范围吗?,ruby,Ruby,我是ruby的初学者,试图用它来帮助我分析生物数据。我需要尝试将一组数据(数组中的数字)与另一组数据进行特定匹配(例如数字+/-0.25) 到目前为止,我已经提出了将一个数据集更改为范围而不是数字的方法: def range(arr) c = [] arr.each do |b| b = (b-0.25..b+0.25) b = b.to_a c << b end c = c.flatten return c end 我怎样才能解决这个问

我是ruby的初学者,试图用它来帮助我分析生物数据。我需要尝试将一组数据(数组中的数字)与另一组数据进行特定匹配(例如数字+/-0.25) 到目前为止,我已经提出了将一个数据集更改为范围而不是数字的方法:

def range(arr)
  c = []
  arr.each do |b|
    b = (b-0.25..b+0.25)
    b = b.to_a
    c << b
  end
  c = c.flatten
  return c
end
我怎样才能解决这个问题

背景 这是我的实际数据样本:


119.0456 119.0714 119.0721 119.0737 120.0772 130.0746 131.0737 136.0721 140.0951 143.0697 154.038 154.0744 154.1108 155.0949 156.054 169.053 170.1422 171.0646 171.0686 174.0644 174.0795 180.0539 182.1059


我需要将其与理论集相匹配,我需要在公差为0.002的情况下生成理论集。我正在一步一步地编写代码,以生成我的理论集,因为我对编码还是新手,我只是想知道如何在我的理论集合周围创建+/-0.002的范围,使其与实际集合相匹配。

对于范围方法,您没有显示结束
end
,显示的
end
关闭
arr.each
循环

这可能是问题所在吗

ruby可以有一个以浮点数开始的范围吗

是的,您可以使用浮动创建范围:

r = 0.25..0.75
#=> 0.25..0.75
但是您不能使用遍历它,因为
每个
都依赖于
成功
(例如),并且没有实现该方法

相反,您可以使用with获取显式增量值:

r.step(0.1) { |f| puts f }
输出:

0.25
0.35
0.45
0.55
0.65
0.75
0.25
0.25000000000000006
0.2500000000000001
0.25000000000000017
0.2500000000000002
0.2500000000000003
0.25000000000000033
0.2500000000000004
0.25000000000000044
0.2500000000000005
0.25000000000000056
0.2500000000000006
...

为了好玩,让我们看看如果我们利用:

输出:

0.25
0.35
0.45
0.55
0.65
0.75
0.25
0.25000000000000006
0.2500000000000001
0.25000000000000017
0.2500000000000002
0.2500000000000003
0.25000000000000033
0.2500000000000004
0.25000000000000044
0.2500000000000005
0.25000000000000056
0.2500000000000006
...

代码给出了所需的数组,但是我总是得到

TypeError: can't iterate from Float.
TypeError: can't iterate from Float.
我怎样才能解决这个问题

您可以构建一个范围数组:

def range(arr)
  arr.map { |b| b-0.25..b+0.25 }
end

range [1, 2, 3]
#=> [0.75..1.25, 1.75..2.25, 2.75..3.25]
arr1 = [1,2,3]
arr2 = [1.25, 1.85, 4.25]
s = 0.25

arr1.zip(arr2).select { |a, b| (a-b).abs <= s }
#=> [[1, 1.25], [2, 1.85]]

如果我正确理解了您的问题,您可以这样做:

def range(arr)
  arr.map { |b| b-0.25..b+0.25 }
end

range [1, 2, 3]
#=> [0.75..1.25, 1.75..2.25, 2.75..3.25]
arr1 = [1,2,3]
arr2 = [1.25, 1.85, 4.25]
s = 0.25

arr1.zip(arr2).select { |a, b| (a-b).abs <= s }
#=> [[1, 1.25], [2, 1.85]]
arr1=[1,2,3]
arr2=[1.25,1.85,4.25]
s=0.25
arr1.zip(arr2).选择{a,b |(a-b).abs[[1,1.25],[2,1.85]]
关键方法:,和。

首先,此代码:

def range(arr)
  c = []
  arr.each do |b|
    b = (b-0.25..b+0.25)
    c << b
  end
  return c
end

第二,正如其他人所说,浮动范围确实存在,但你不能在浮动范围内迭代,因为Ruby无法知道你想要的增量。从技术上讲,范围(1.0..2.0)包含无限数量的数字(例如1.2324123和1.9232311)因此,如果不说明每个步骤应该有多大,就无法进行迭代。您可以这样做:

range.step(0.1) { |f| #do stuff with f }

但是,如果您的目标是比较数组,以查看[1,2,3]是否符合[0.75..1.25,1.75..2.25,2.75..3.25]的范围,则根本不必迭代范围。您应该使用
.cover?()
方法来查看数字是否在范围内:

def in_range(arr, ranges)
  return false unless arr.size == ranges.size
  arr.zip(ranges).do { |a, r| return false unless r.cover? a }
  return true
end

返回c
之前,您缺少一个
结尾
。我假设这是一个stackoverflow输入错误,因为您说您的函数返回所需的数组。另外,您是否可以添加实际生成错误的代码(您在该范围内迭代的代码?如果您试图查看数据是否在该范围内,我怀疑有一种更简单的方法可以将此问题全部解决。“我需要尝试将一组数据与另一组数据进行特定的匹配”–你能举个例子吗?刚刚编辑了代码以包含整个脚本119.0456 119.0714 119.0721 119.0737 120.0772 130.0746 131.0737 136.0721 140.0951 143.0697 154.038 154.0744 154.1108 155.0949 156.054 169.053 170.1422 171.0646 171.0686 174.0644 174.0795 180.0539 182.1059这是我的实际数据示例,我需要将其与理论集,我需要生成,公差为0.002。我正在一步一步地编写代码,以生成我的理论集,因为我对编码还是新手,我只是想知道如何在理论集周围创建+/-0.002的范围,以使其与实际集相匹配。虽然非常大,但
1.0..2.0
是有限的;-)@Stefan-haha,没错!但是一系列浮点所覆盖的值的数量要多得多,因为逻辑是由值而不是范围来处理的:
(1.0..2.0).cover?BigDecimal.new(“1.23223”)#=>true
在你发表评论之前,我不知道情况是这样的,但我检查了一下,幸运的是:3这不是问题b/c用户得到的是一个类型错误,而不是一个语法错误。我使用你的答案修改了我的代码,并用简单的条件对其进行了测试,比如数组[1,2,3]上0.2范围内的步骤0.1。它可以工作,但有时它会在小数点后加上随机数0。例如,我得到1.90000000000000001而不是1.9,得到3.19999999997而不是3.2。我不明白为什么会发生这种情况