Apparent bug in DateHelper::distance_of_time_in_words (Rails 2.3.2)


There seems to be a rounding error in this method.

The problem lies in the following lines:

85: when 2880..43199 then locale.t :x_days, :count => (distance_in_minutes / 1440).round 87: when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes / 43200).round 89: else locale.t :over_x_years, :count => (distance_in_minutes / 525600).round

In the calculation (distance_in_minutes / 1440), we are actually dividing two integers, which of course means that the result of the division is truncated.

So for instance, if distance_in_minutes is 4319 minutes (just 1 minute short of 3 full days), then the result of this division is truncated to 2, and the method returns the string "2 days".

These changes correct the problem, by ensuring that the divisors are floats: 85: when 2880..43199 then locale.t :x_days, :count => (distance_in_minutes / 1440.0).round 87: when 86400..525599 then locale.t :x_months, :count => (distance_in_minutes / 43200.0).round 89: else locale.t :over_x_years, :count => (distance_in_minutes / 525600.0).round

So, does anyone know if this actually is a bug, or if there is something I'm missing? Line 83 already ensures that the division is performed with floats, so this case does not exhibit the problem I described: 83: when 90..1439 then locale.t :about_x_hours, :count => (distance_in_minutes.to_f / 60.0).round

I think this is a bug and I noticed it earlier but didn't think of
pointing it out, good work!