4

我正在训练我的 Ruby 技能,exercism.io但我遇到了space-age挑战。

我需要将 1.000.000.000 秒转换为年,我的测试预计31.69是这种转换的结果,但我的实现实际上返回31.71. 下面我将展示两者:

def test_age_in_earth_years
  age = SpaceAge.new(1_000_000_000)
  assert_equal 31.69, age.on_earth
end

class SpaceAge
  def initialize(age_in_seconds)
    @age_in_seconds = age_in_seconds
  end

  def seconds
    @age_in_seconds
  end

  def on_earth
    (@age_in_seconds/31536000.00).round(2)
  end

end

有小费吗?

4

3 回答 3

2

一年平均有 365.25 天,这是 31557600 秒,而不是 31536000 秒。这解释了差异。

于 2013-09-10T05:45:19.143 回答
0

只需进行向后计算,您想知道一年中有多少天,如果 1,000,000,000 秒给您 31.69 年。

31.69 = 1,000,000,000 / (Y * 60 * 60 * 24) => Y = 365.228

那种暗示,如果你四舍五入到两位小数,那么 Y = 365.25。如果你测试一下,你会得到 ~31.688,四舍五入到小数点后两位是 31.69。除非您有更多数据,否则您无法更接近 Y 的原始值。

如果您遵循每四年是闰年的规则,那么选择 Y = 365.25 是有意义的,那么一年中的平均天数是365 + 1/4

然而这并不完全正确,因为一个太阳年略短于 365.25 天,所以公历每 400 年省略三个闰日。省略的天数属于 100 的倍数但不是 400 的倍数的年份。因此 1300、1400、1500 不是闰年,但 1600 和 2000 是。所以一年的平均天数是 365 + 1/4 - 1/100 + 1/400 = 365.2425。

以上只是一个近似值,因为它没有考虑闰秒,如果你想完全准确,你需要一个实际的日期间隔,并找到一个闰秒表,并将其考虑在内。

于 2013-09-10T06:42:30.650 回答
0

我可以通过这种方式获得预期值:

time = Time.at(1_000_000_000)
time.year - 1970 + (time.yday / 365.25).round(2) # => 31.69
于 2013-09-10T07:49:54.910 回答