Integer division with rounding
我需要做整数除法。我希望以下内容返回
1 | 187 / 100 # => 1 |
这个:
1 | (187.to_f / 100).round # => 2 |
会起作用,但作为解决方案似乎并不优雅。
编辑
因为我一直在投票,我会更清楚我的用例:
我需要计算一个价格税。我所有的价格都是美分。问责制世界中没有1美分以下,所以我需要确保我的所有价格都是整数(那些检查税的人不喜欢错误......真的!)
但另一方面,税率
所以我想找到最好的写作方式:
1 2 3 | def tax_price(price) price * TAX_RATE / 100 end |
肯定会返回一个整数,没有任何浮动副作用。
我害怕去
- 浮点乘法的Ruby奇怪问题
- ruby浮点错误
所以我发现留在
您可以在保留整数世界的同时执行此操作,如下所示:
1 2 3 | def round_div(x,y) (x + y / 2) / y end |
如果您愿意,可以使用以下变体进行猴子补丁
1 2 3 4 5 6 7 | class Fixnum def round_div(divisor) (self + divisor / 2) / divisor end end 187.round_div(100) # => 2 |
否 -
这是一个知之甚少的方法,Numeric#fdiv
你这样使用它:
不确定,但这可能是你的想法。
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),你必须将整数转换为浮点数。
另一种不那么分散注意力的方法可以是将
1 | (187.0 / 100).round |
但是,通常我们不对具体的整数进行操作,但变量和这种方法没有用。