Ruby Integer / Fixnum Weirdness - PullRequest
       0

Ruby Integer / Fixnum Weirdness

1 голос
/ 15 сентября 2010

Я пытаюсь написать функцию, которая вытягивает младший порядковый номер из целого числа. Например:

> 24689.lowest_order
=> 9

Пока у меня есть:

class Integer
  def lowest_order
    Integer (self / 10.0 - self / 10) * 10
  end
end

И это работает .... иногда:

irb(main):002:0> n = 235
=> 235
irb(main):007:0> n.class
=> Fixnum
irb(main):004:0> n/10.0
=> 23.5
irb(main):005:0> n/10
=> 23
irb(main):003:0> n.lowest_order
=> 5
irb(main):008:0> (n/10.0 - n/10)*10
=> 5.0

в то время как в других случаях происходит сбой (без изменения кода между примерами):

irb(main):010:0> n = 232
=> 232
irb(main):021:0> n.class
=> Fixnum
irb(main):009:0> n.lowest_order
=> 1
irb(main):011:0> n/10.0
=> 23.2
irb(main):012:0> n/10
=> 23
irb(main):013:0> n/10.0 - n/10
=> 0.199999999999999
irb(main):022:0> n = Integer 232
=> 232
irb(main):023:0> n/10.0 - n/10
=> 0.199999999999999

Что за сделка? Я бы предпочел не фильтровать целое число через строку только для того, чтобы получить самую младшую часть числа.

Спасибо!

1 Ответ

5 голосов
/ 15 сентября 2010

Есть причина, по которой вы не можете просто сделать n % 10 или n.modulo 10 (см. документация )?

Чтобы ответить на вопрос "почему это не работает?" часть вашего вопроса, ответ таков: арифметика с плавающей точкой не всегда ведет себя так, как вы ожидаете, что .

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