我需要在浮标上做round half to even,即
这些是一些结果,例如:
0.5=>0
1.49=>1
1.5=>2
2.5=>2
2.51=>3
3.5=>4
答案 0 :(得分:2)
BigDecimal
类已经实现了舍入模式一半甚至。您只需使用BigDecimal.mode
方法将ROUND_MODE
设置为:half_even
:
require 'bigdecimal'
def round_half_to_even(float)
BigDecimal.mode(BigDecimal::ROUND_MODE, :half_even)
BigDecimal.new(float, 0).round
end
或者使用带有一些参数的round
:
require 'bigdecimal'
def round_half_to_even(float)
BigDecimal.new(float, 0).round(0, :half_even).to_i
end
请注意,BigDecimal#round
在没有参数的情况下使用时会返回Integer
,但在与参数一起使用时会返回BigDecimal
。因此需要在第二个示例中调用to_i
,而不是在第一个示例中调用{<1}}。
答案 1 :(得分:1)
我会重新打开Float类来创建一个round_half_to_even函数:
{{1}}
答案 2 :(得分:0)
def round_half_to_even f
q, r = f.divmod(2.0)
q * 2 +
case
when r <= 0.5 then 0
when r >= 1.5 then 2
else 1
end
end
round_half_to_even(0.5) # => 0
round_half_to_even(1.49) # => 1
round_half_to_even(1.5) # => 2
round_half_to_even(2.5) # => 2
round_half_to_even(2.51) # => 3
round_half_to_even(3.5) # => 4
答案 3 :(得分:0)
您可以执行以下操作:
def round_half_to_even(f)
floor = f.to_i
return f.round unless f==floor+0.5
floor.odd? ? f.ceil : floor
end
round_half_to_even(2.4) #=> 2
round_half_to_even(2.6) #=> 3
round_half_to_even(3.6) #=> 4
round_half_to_even(2.5) #=> 2
round_half_to_even(3.5) #=> 4