我需要进行整数除法。我希望以下内容返回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
世界,因为它对数字表示有非常奇怪的副作用,如:
所以我发现留在integer
或fractional
世界更安全,因此我的问题。
答案 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)