【发布时间】:2017-10-17 22:55:05
【问题描述】:
为什么在尝试查找股票的平均交易量时,以下方法会返回无穷大:
class Statistics
def self.averageVolume(stocks)
values = Array.new
stocks.each do |stock|
values.push(stock.volume)
end
values.reduce(:+).to_f / values.size
end
end
class Stock
attr_reader :date, :open, :high, :low, :close, :adjusted_close, :volume
def initialize(date, open, high, low, close, adjusted_close, volume)
@date = date
@open = open
@high = high
@low = low
@close = close
@adjusted_close = adjusted_close
@volume = volume
end
def close
@close
end
def volume
@volume
end
end
CSV.foreach(fileName) do |stock|
entry = Stock.new(stock[0], stock[1], stock[2], stock[3], stock[4], stock[5], stock[6])
stocks.push(entry)
end
以下是方法的调用方式:
Statistics.averageVolume(stocks)
使用包含 251 行的文件输出到控制台:
stock.rb:32: warning: Float 23624900242507002003... out of range
Infinity
在以下行调用警告:values.reduce(:+).to_f / values.size
【问题讨论】:
-
请提供minimal reproducible example,让我们确切知道警告发生在哪一行。
-
警告发生在以下行
values.reduce(:+).to_f / values.size。 -
在第 7 行的
end后面打断点,看看values长什么样。 -
除以零是一种快速破坏事物的好方法。如果那是一个空数组...
-
专业提示:如果您有一个将 1:1 映射到函数参数的数组,请将其分解。
Stock.new(*stock)不那么混乱。
标签: ruby average reduce infinity