Начиная с Ruby 2.4, round
принимает необязательный аргумент ключевого слова half
, чтобы указать режим округления для "[...] чисел, которые находятся на полпути между двумя возможными округленными значениями"
Ваш метод станет следующим:
def round_random(x)
x.round(half: [:up, :down].sample)
end
round_random(2.6) #=> 3 (always)
round_random(2.5) #=> 2
round_random(2.5) #=> 3
round_random(2.5) #=> 2
round_random(2.4) #=> 2 (always)
Также есть :even
, который реализует от половины до четного - правило, позволяющее избежать смещения путем округления доследующее четное число в случае ничьей:
1.5.round(half: :even) #=> 2
2.5.round(half: :even) #=> 2
3.5.round(half: :even) #=> 4
4.5.round(half: :even) #=> 4
Возможно, это было бы более детерминированной альтернативой вашей проблеме.