我在exercism.io
训练我的Ruby技能,而且我遇到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
任何提示?
答案 0 :(得分:2)
一年平均为365.25天,这是31557600秒,而不是31536000秒。这解释了差异。
答案 1 :(得分: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。
以上只是一个近似值,因为它不考虑闰秒。如果你想要完全准确,你需要一个实际的日期间隔,并找到一个闰秒表,并将这些考虑在内好。
答案 2 :(得分:0)
我可以通过这种方式获得预期的价值:
time = Time.at(1_000_000_000)
time.year - 1970 + (time.yday / 365.25).round(2) # => 31.69