我可以实现圆形半边甚至吗?

时间:2016-02-12 10:03:45

标签: ruby rounding

我需要在浮标上做round half to even,即

  1. 如果值是两个整数之间的中间值(打破平局,y的小数部分正好是0.5)则舍入到最接近的偶数整数,
  2. else,标准round(在Ruby中舍入到最接近的Integer)。
  3. 这些是一些结果,例如:

    0.5=>0
    1.49=>1
    1.5=>2
    2.5=>2
    2.51=>3
    3.5=>4
    

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
相关问题