年齢の計算

最近、誕生日から年齢を求める計算式が流行ってる。以下のようなもの

def age1(birthday, theday = Date.today)
  t, b = [theday, birthday].map{|d|
    d.year*10000 + d.month*100 + d.day
  }
  (t-b)/10000
end

元の式だとキャスト相当の (int) とかあったりする。それはいいんだが、/10000 するくらいなら最初から浮動小数点数で求めとけばいいんじゃないだろうか。

def age2(birthday, theday = Date.today)
  t, b = [theday, birthday].map{|d|
    d.year + d.month*0.01 + d.day*0.0001
  }
  (t-b).floor
end

どっちにしてもなんだかまどろっこしい感じがするのはなぜだろう。

もうちょっと考えてみた。要するに、この問題はチョコレートを使って計算する場合の Step 6 をどうするか、ということに尽きるので、10000で割るということではなく、切捨てるということのほうにポイントがある。そう考えると floor のほうが明示的なのでいいのかも。あとはなんだろう、ステップ関数を使うものだったらなんでもいいんじゃないかな。mod でもいいと思う。abs() と減算の組み合わせとかもありえると思う。