唐突ですが、春分の日、秋分の日をそれぞれ中日として、前後3日ずつ加えた7日間を彼岸、お彼岸という。
なんで、ちょっと早いお彼岸の話しかというと、Owndにプログラムが完成したからです。
春分の日、秋分の日
前にも作ったことがあるんだけど、ちょっと期間を長めに計算してみました。
なんと300年分。
しかも1851年から2150年まで。
1851年て江戸時代で元号は嘉永だし、2150年の元号なんて、平成の次の元号すら解らないのにね。
こういう度が過ぎたりすることをやったりもする。
さて、今回もプログラミングについて書いてみる。
春分の日や秋分の日を求める計算式があって、
日=整数化関数(α+0.242194×(西暦-1980)-床関数((西暦-1980)/4))
まず、αの値ですが、これは、いつの春分の日を求めたいのか、いつの秋分の日を求めたいのか、で変わる変数です。
さて、この日を計算する式には整数化関数と床関数という似たような関数をあえて使ってみました。
皆さん違いがわかりますか?
正の数であれば結果は同じですが、負の数だと結果が異なる場合があります。
例えば、Javasciptにおいては、
parseInt(1.5);
Math.floor(1.5);
では、どちらも1を返しますが、
parseInt(-1.5);
Math.floor(-1.5)
では、前者は-1、後者は-2を返します。
例えば、Excelにおいては、
INT(1.5)
FLOOR(1.5,1)
では、どちらも1を返す。
INT(-1.5)
FLOOR(-1.5,1)
では、どちらも-2を返す。
つまり、Excelでは整数化関数が床関数と同じ結果が返ってきています。
では、Excelで小数点以下を切り捨てる関数はあるのだろうか。
それはROUNDDOWN関数です。
ROUNDDOWN(1.5,0)
は、1を返す。
ROUNDDOWN(-1.5,0)
は、-1を返す。
というわけで、Excelで上手くいっている式を、そのままJavascriptに移植、もしくはその逆を行ったりするときは注意が必要ということですね。
1981-1980>0
1979-1980<0
ですので、1979年の春分の日を求めてみます。
実際は1979年3月21日です。
例えば、ExcelでA1セルに西暦の1979、B1セルに3が入っていたとして、C1セルに、
=INT(20.8357+0.242194*(A1-1980)-INT((A1-1980)/4))
で21、つまり21日という結果が返ってきます。
ExcelがINT関数だからとJavascriptでparseInt関数を使うと、
var year = 1979;
var month = 3;
var day = parseInt(20.8357+0.242194*(year-1980)-parseInt((year-1980)/4));
ではday=20、つまり20日という結果になってしまいます。
正しく計算するならば、
var day = parseInt(20.8357+0.242194*(year-1980)-Math.floor((year-1980)/4));
または、
var day = Math.floor(20.8357+0.242194*(year-1980)-Math.floor((year-1980)/4));
ということで、day=21になります。
皆さん、気をつけなはれや
ではでは
なんで、ちょっと早いお彼岸の話しかというと、Owndにプログラムが完成したからです。
春分の日、秋分の日
前にも作ったことがあるんだけど、ちょっと期間を長めに計算してみました。
なんと300年分。
しかも1851年から2150年まで。
1851年て江戸時代で元号は嘉永だし、2150年の元号なんて、平成の次の元号すら解らないのにね。
こういう度が過ぎたりすることをやったりもする。
さて、今回もプログラミングについて書いてみる。
春分の日や秋分の日を求める計算式があって、
日=整数化関数(α+0.242194×(西暦-1980)-床関数((西暦-1980)/4))
まず、αの値ですが、これは、いつの春分の日を求めたいのか、いつの秋分の日を求めたいのか、で変わる変数です。
春分の日 | 秋分の日 | |
1851~1899 | 19.8277 | 22.2588 |
1900~1979 | 20.8357 | 23.2588 |
1980~2099 | 20.8431 | 24.2488 |
2100~2150 | 21.8510 | 24.2488 |
さて、この日を計算する式には整数化関数と床関数という似たような関数をあえて使ってみました。
皆さん違いがわかりますか?
正の数であれば結果は同じですが、負の数だと結果が異なる場合があります。
例えば、Javasciptにおいては、
parseInt(1.5);
Math.floor(1.5);
では、どちらも1を返しますが、
parseInt(-1.5);
Math.floor(-1.5)
では、前者は-1、後者は-2を返します。
例えば、Excelにおいては、
INT(1.5)
FLOOR(1.5,1)
では、どちらも1を返す。
INT(-1.5)
FLOOR(-1.5,1)
では、どちらも-2を返す。
つまり、Excelでは整数化関数が床関数と同じ結果が返ってきています。
では、Excelで小数点以下を切り捨てる関数はあるのだろうか。
それはROUNDDOWN関数です。
ROUNDDOWN(1.5,0)
は、1を返す。
ROUNDDOWN(-1.5,0)
は、-1を返す。
というわけで、Excelで上手くいっている式を、そのままJavascriptに移植、もしくはその逆を行ったりするときは注意が必要ということですね。
1981-1980>0
1979-1980<0
ですので、1979年の春分の日を求めてみます。
実際は1979年3月21日です。
例えば、ExcelでA1セルに西暦の1979、B1セルに3が入っていたとして、C1セルに、
=INT(20.8357+0.242194*(A1-1980)-INT((A1-1980)/4))
で21、つまり21日という結果が返ってきます。
ExcelがINT関数だからとJavascriptでparseInt関数を使うと、
var year = 1979;
var month = 3;
var day = parseInt(20.8357+0.242194*(year-1980)-parseInt((year-1980)/4));
ではday=20、つまり20日という結果になってしまいます。
正しく計算するならば、
var day = parseInt(20.8357+0.242194*(year-1980)-Math.floor((year-1980)/4));
または、
var day = Math.floor(20.8357+0.242194*(year-1980)-Math.floor((year-1980)/4));
ということで、day=21になります。
皆さん、気をつけなはれや
ではでは