整数除法与舍入

Aug*_*ger -1 ruby

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

187 / 100 # => 1
Run Code Online (Sandbox Code Playgroud)

这个:

(187.to_f / 100).round # => 2
Run Code Online (Sandbox Code Playgroud)

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


编辑

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

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

但另一方面,税率是19%.

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

def tax_price(price)
  price * TAX_RATE / 100
end
Run Code Online (Sandbox Code Playgroud)

可靠地返回一个整数,而没有任何浮动副作用.

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

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

pjs*_*pjs 8

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

def round_div(x,y)
  (x + y / 2) / y
end
Run Code Online (Sandbox Code Playgroud)

如果您愿意,可以Fixnum使用以下变体进行修补:

class Fixnum
  def round_div(divisor)
    (self + divisor / 2) / divisor
  end
end

187.round_div(100)    # => 2
Run Code Online (Sandbox Code Playgroud)


Mat*_*tW. 6

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


Alf*_*fie 5

这是一个不太为人所知的方法,Numeric#fdiv

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