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

1 年は平均 365.25 日で、これは 31536000 秒ではなく 31557600 秒です。これは違いを説明しています。

于 2013-09-10T05:45:19.143 に答える
0

1,000,000,000 秒で 31.69 年が得られる場合、逆方向の計算を行うだけで、1 年に何日あると想定されるかを知りたいとします。

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

これは、小数点以下 2 桁に丸めると、Y = 365.25 になることを示唆しています。そして、テストすると、〜31.688が得られ、小数点以下2桁に四捨五入すると31.69になります. より多くのデータがない限り、Y の元の値に近づくことはできません。

Y = 365.25 を選択することは、4 年ごとに閏年であるという規則に従う場合に意味があり、1 年の平均日数は です365 + 1/4

ただし、これは完全に正しいわけではありません。太陽年は 365.25 日よりわずかに短いため、グレゴリオ暦では 400 年ごとに 3 つの閏日が省略されています。省略された日は、100 の倍数であるが 400 の倍数ではない年に分類されます。したがって、1300、1400、1500 はうるう年ではありませんが、1600 および 2000 はうるう年です。したがって、1 年の平均日数は 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 に答える