Метод Ruby для округления числа с плавающей запятой, если дробная составляющая равна 0,5 - PullRequest
0 голосов
/ 10 декабря 2018

Я работаю над статистической проблемой, и мне нужно округлить случайным образом вверх или вниз, если дробный компонент равен 0,5.Следующий код должен работать

def round_random(x)
    return x.round unless x.modulo(1) == 0.5
    x.floor + rand(2)
end

, но я вспоминаю некоторые обсуждения о том, как сделать это в ruby, поэтому мне интересно, существует ли на самом деле стандартный метод для него.

1 Ответ

0 голосов
/ 10 декабря 2018

Начиная с 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

Возможно, это было бы более детерминированной альтернативой вашей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...