整数除法与舍入

时间:2016-04-28 14:17:58

标签: ruby

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

187 / 100 # => 1

此:

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

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

修改

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

我需要计算价格税。我所有的价格都是美分。问责制世界中没有任何低于1美分,所以我需要确保我的所有价格都是整数(那些检查税的人不会犯错误......真的!)

但另一方面,税率为19%

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

def tax_price(price)
  price * TAX_RATE / 100
end

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

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

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

8 个答案:

答案 0 :(得分:8)

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

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

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

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

187.round_div(100)    # => 2

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

您可以像这样使用它:187.fdiv(100).round

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

这应该适合你:

使用这样的语法。

(number.to_f/another_number).round

示例:

(18.to_f/5).round

答案 5 :(得分:0)

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

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

(187.0 / 100).round

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

答案 6 :(得分:0)

经过一番思考,我可以:

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

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

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

答案 7 :(得分:0)

如果想要的是实际上仅在有余数的情况下将结果增加1(例如,用于计数分页/批处理),则可以使用'%'(模运算)进行余数检查。

# to add 1 if it's not an even division
a = 187
b = 100
result = a / b #=> 1
result += 1 if (a % b).positive?
#=> 2

# or in one line
result = (a / b) + ((a % b).zero? ? 0 : 1)