Ruby Rounding Convention - PullRequest
       14

Ruby Rounding Convention

0 голосов
/ 22 февраля 2019

Я пытаюсь определить функцию, которая учитывает следующие условия округления (округление до ближайшего целого или десятого):

enter image description here

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

Вот моя реализация (извините за условную проверку, но только для этого примера):

  def convention_round(number, to_int = false)
    if to_int
      number.round
    else
      number.round(1)
    end
  end

  convention_round(1.2234) # 1.2
  convention_round(1.2234, true) # 1

  convention_round(1.896) # 1.9
  convention_round(1.896, true) # 2

  convention_round(1.5) # 1.5
  convention_round(1.5, true) # 2

  convention_round(1.55) # 1.6
  convention_round(1.55, true) # 2

  convention_round(-1.2234) # -1.2
  convention_round(-1.2234, true) # -1

  convention_round(-1.896) # -1.9
  convention_round(-1.2234, true) # -2

  convention_round(-1.5) # -1.5
  convention_round(-1.5, true) # -2 (Here I want rounded to -1)

  convention_round(-1.55) # -1.6 (Here I want rounded to -1.5)
  convention_round(-1.55, true) # -2

Я не на 100%уверен, что лучший способ округления отрицательных чисел.

Спасибо!

1 Ответ

0 голосов
/ 22 февраля 2019

Из документов вы можете использовать для этого Integer#roundFloat#round) следующим образом:

def convention_round(number, precision = 0)
  number.round(
    precision,
    half: (number.positive? ? :up : :down)
  )
end

convention_round(1.4)      #=> 1
convention_round(1.5)      #=> 2
convention_round(1.55)     #=> 2
convention_round(1.54, 1)  #=> 1.5
convention_round(1.55, 1)  #=> 1.6

convention_round(-1.4)      #=> -1
convention_round(-1.5)      #=> -1 # !!!
convention_round(-1.55)     #=> -2
convention_round(-1.54, 1)  #=> -1.55
convention_round(-1.55, 1)  #=> -1.5 # !!!

Это невполне сигнатура метода, которую вы просили, но это более общая форма - поскольку вы можете указать произвольную точность.

Однако я хотел бы указать на иронию, что (несмотря на название метода) это не обычный способ округления чисел.

Существует несколько различных соглашений, все (?) которых поддерживаются библиотекой ядра ruby ​​(см. ссылку на документацию выше), но это не так.один из них.

...