关于ruby:整数除法与舍入

Integer division with rounding

我需要做整数除法。我希望以下内容返回2而不是实际的1

1
187 / 100 # => 1

这个:

1
(187.to_f / 100).round # => 2

会起作用,但作为解决方案似乎并不优雅。 187 / 100 = 2是否只有整数运算符?

编辑

因为我一直在投票,我会更清楚我的用例:

我需要计算一个价格税。我所有的价格都是美分。问责制世界中没有1美分以下,所以我需要确保我的所有价格都是整数(那些检查税的人不喜欢错误......真的!)

但另一方面,税率19%

所以我想找到最好的写作方式:

1
2
3
def tax_price(price)
  price * TAX_RATE / 100
end

肯定会返回一个整数,没有任何浮动副作用。

我害怕去float世界,因为它对数字表示有非常奇怪的副作用,如:

  • 浮点乘法的Ruby奇怪问题
  • ruby浮点错误

所以我发现留在integerfractional世界更安全,因此我的问题。


您可以在保留整数世界的同时执行此操作,如下所示:

1
2
3
def round_div(x,y)
  (x + y / 2) / y
end

如果您愿意,可以使用以下变体进行猴子补丁Fixnum

1
2
3
4
5
6
7
class Fixnum
  def round_div(divisor)
    (self + divisor / 2) / divisor
  end
end

187.round_div(100)    # => 2


否 - (a.to_f / b.to_f).round是规范的方法。整数/整数的行为(例如)在C标准中定义为"丢弃余数"(参见http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf页面) 82)和ruby使用本机C函数。


这是一个知之甚少的方法,Numeric#fdiv

你这样使用它:187.fdiv(100).round


不确定,但这可能是你的想法。

1
2
q, r = 187.divmod(100)
q + (100 > r * 2 ? 0 : 1) # => 2

这应该适合你:

使用这样的语法。

1
(number.to_f/another_number).round

例:

1
(18.to_f/5).round

经过一番思考,我可以:

  • 使用过BigDecimals但感觉就像火箭筒一样杀死一只鸟

  • 或者我可以使用不会在流程中使用浮动划分的自定义方法,如@sawa建议的那样

    def rounded_integer_div(分子,分母)
    q,r = numerator.divmod(分母)
    q +(100> r * 2?0:1)
    结束


由于@MattW已经回答(+1),你必须将整数转换为浮点数。

另一种不那么分散注意力的方法可以是将.0添加到整数:

1
(187.0 / 100).round

但是,通常我们不对具体的整数进行操作,但变量和这种方法没有用。