如何添加四舍五入数组



我花了一些时间试图找到一种方法来对数组中的每个元素进行基本操作,如sum, round等。

我没有看到一个内置的方法来做到这一点,所以我试图创建我自己的后找到"通用的'sum'和'mean'方法为Ruby数组"。

有人能解释为什么我的round方法不起作用吗?

class Array
  def sum
    inject(nil) { |sum, x| sum ? sum + x : x }
  end
  def mean
    sum / size
  end
  def round(p)
    inject(nil) { |x| (x * 10 ^ (p-1)).floor / 10 ^ (p - 1) }
  end   
end
puts [1.1234, 1.45656, 1.546567, 1.4577887].mean
puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6)

您需要以下内容:

class Array
  def sum
    inject(:+)
  end
  def mean
    sum / size.to_f
  end
  def round(p)
    map { |n| n.round(p) }
  end 
end
puts [1.1234, 1.45656, 1.546567, 1.4577887].mean
1.3960789249999999
puts [1.1234, 1.45656, 1.546567, 1.4577887].round(6)
1.1234
1.45656
1.546567
1.457789

注意,当数组只包含整数时,需要sum.to_f(或size.to_f)。如果arr.sum = 3arr.size = 2, sum / size #=> 1sum / size.to_f #=> 1.5

要回答你问题的why部分,你的实现有三个问题:

  1. 概念性:inject用于获取一堆事物并将它们组合成一个事物。在这里,您有内容,并希望并列相同数量的其他内容。这个方法是map:

    [1, 2, 3].inject(:+) # => 6
    [-1, 2, -3].map(&:abs) # => [1, 2, 3]
    
  2. 语法:^是位异或,不是power to。操作符为**

  3. 基础数学:让我们通过尝试将数字1.77四舍五入一个小数点来进行完整性检查:

    (17.7)。地板/10 = 1.7

最新更新