2010-09-15 5 views
1

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

> 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 

Какова сделка? Я бы предпочел не фильтровать целое число через String только для получения самой младшей части числа.

Спасибо!

ответ

5

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

Чтобы ответить «почему это не работает?» часть вашего вопроса, ответ в том, что floating point arithmetic doesn't always behave as you'd expect it to.

+0

Я даже не подумал, что ... его явно слишком поздно, чтобы программировать! Спасибо, Грег. – 2010-09-15 05:25:13