Ruby中如何将字符串数组转为浮点数数组以计算平均值
错误原因
Array#map方法默认返回新数组,不会修改原数组对象,你执行array.map(&:to_f)后没有将转换后的浮点数组赋值回array变量,原array中仍然存储的是从file.txt读取的字符串类型的行内容- 后续
reduce累加时用整数0和字符串做加法运算,触发类型不匹配错误
修复方案
你可以选择以下任意一种方式修复:
方案1:接收map返回的转换后数组
#!/usr/bin/ruby require 'bigdecimal' require 'bigdecimal/util' array = IO.readlines 'file.txt' # 将转换为浮点数的新数组赋值给array array = array.map(&:to_f) numerator = array.reduce(0) { |a, v| a + v } denominator = array.count mean = numerator.to_f / denominator.to_f puts mean
方案2:累加时直接做类型转换
不需要提前做map转换,直接在reduce的累加逻辑里转浮点数即可:
#!/usr/bin/ruby require 'bigdecimal' require 'bigdecimal/util' array = IO.readlines 'file.txt' # 累加时直接将每行字符串转浮点数,初始值设为0.0避免类型转换问题 numerator = array.reduce(0.0) { |sum, line| sum + line.to_f } denominator = array.count mean = numerator / denominator puts mean
修复后执行ruby script.rb即可得到正确的平均值237.778575。
内容的提问来源于stack exchange,提问作者Smeterlink
相关产品推荐
相关产品推荐

