在Ruby中将范围转换为浮点值数组时出错

时间:2014-01-21 09:36:48

标签: ruby arrays range

如何将startend间隔的范围转换为Float值? 我收到的错误为TypeError: can't iterate from Float

IRB会议

irb(main):058:0> (1..10).to_a
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

irb(main):059:0> ('a'..'k').to_a
=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"]

irb(main):061:0> ((1.1)..(1.10)).to_a
TypeError: can't iterate from Float
    from (irb):61:in `each'
    from (irb):61:in `to_a'
    from (irb):61
    .........

4 个答案:

答案 0 :(得分:7)

试试这个:

(1.1..1.2).step(0.01).map { |x| x.round(2) }
  # => [1.1, 1.11, 1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2]

答案 1 :(得分:3)

您必须首先指定要迭代的步骤:

((1.1)..(1.10)).step(0.1).to_a

#=> [1.1]     as range has only one element :)

((1.1)..(1.5)).step(0.1).to_a

# [1.1, 1.2, 1.3, 1.4, 1.5]

但请注意,由于您可能会遇到浮动舍入错误,结果可能如下所示,因此风险非常大:

[1.1, 1.2000000000000002, 1.3, 1.4000000000000001, 1.5]

使用BigDecimals来避免这种情况。

答案 2 :(得分:3)

例如:

(1.1..1.2).step(0.01).to_a
# => [1.1, 1.11, 1.12, 1.1300000000000001, 1.1400000000000001, 1.1500000000000001, 1.1600000000000001, 1.1700000000000002, 1.1800000000000002, 1.1900000000000002, 1.2]

您要将Range转换为Enumerator,可以使用Array方法将其转换为#to_a

答案 3 :(得分:2)

阅读Custom Objects in Ranges

  

可以使用可以使用<=>运算符进行比较的任何对象构建范围。将范围视为序列(#each和从Enumerable继承的方法)的方法期望begin对象实现succ方法以按顺序返回下一个对象。 stepinclude?方法要求begin对象实现succ或为数字。

这将给你一个想法,关于是什么因素让Ruby给你带来了这个错误。