« ポートレイト: 松本あやかさん 10 その3 | メイン | 暖かくなってきたので釣りしてきた »

2013年3月27日

年齢を計算する。365.25で割るのは間違いです。 >>ソフトウェア 

本でも間違ったこと堂々と載せてますので、書いておくべきだと思うので書いときます。

年齢を計算するのに365.25で割るのは間違い、です。
閏は4年で1年なので、366日を4で割って、365.25として

Int(DateDiff("d",[生年月日],Now())/365.25)
みたいな計算式が書かれていたりするわけです。経過日数を365.25で単純にわれば年数が出るっていう意味なんですけどね。

で、これが、今日だと2013/03/27 ですが、19720327と、19730327を計算させると同じ40歳っていう値が返ってくる(笑) そりゃあかんだろ。やってごらん。


ほんまあかんわーって思うから。

0.25x4を単純にしてるので...4で割り切れる年度にならないと端数が発生しておかしくなるわけで.....まあ、ともかくバグなのです。。

2004-2012 の03/27生まれの年齢を2013から2020年まで03/27に毎年計算した場合、以下のようになります。


2013
20040327 8
20050327 8
20060327 7
20070327 6
20080327 4
20090327 4
20100327 3
20110327 2
20120327 0

2014
20040327 9
20050327 8
20060327 8
20070327 7
20080327 5
20090327 4
20100327 4
20110327 3
20120327 1

2015
20040327 10
20050327 9
20060327 8
20070327 8
20080327 6
20090327 5
20100327 4
20110327 4
20120327 2

2016
20040327 12
20050327 11
20060327 10
20070327 9
20080327 8
20090327 7
20100327 6
20110327 5
20120327 4

2017
20040327 12
20050327 12
20060327 11
20070327 10
20080327 8
20090327 8
20100327 7
20110327 6
20120327 4

2018
20040327 13
20050327 12
20060327 12
20070327 11
20080327 9
20090327 8
20100327 8
20110327 7
20120327 5

2019
20040327 14
20050327 13
20060327 12
20070327 12
20080327 10
20090327 9
20100327 8
20110327 8
20120327 6

2020
20040327 16
20050327 15
20060327 14
20070327 13
20080327 12
20090327 11
20100327 10
20110327 9
20120327 8

.....となります。さあ、どうでしょう。これでも365.25で割るのを使いますか?表記しますか?


ついでに。正しい年齢とはなんぞや、と。
年齢計算に関する法律なんていうのがあります。年齢は,「出生の日より起算」(年齢計算ニ関スル法律第1項)し,出生日の応答日の前日の満了をもって年齢が加算されます(同法第2項)。

http://www5d.biglobe.ne.jp/~Jusl/TomoLaw/NenreiK.html

ついでに、4月1日生まれは,なぜ早生まれか?http://www5d.biglobe.ne.jp/Jusl/TomoLaw/NenreiKazoekata.htmlというのも、この年齢計算ニ関スル法律にかかわることなので、読んでおくと面白いかもしれませんよ。


※さらに補足。ExcelのDATEDIFはYYYYが満1年にならないと返ってこないようだけどね。関数を信じるよりは自前で実装するのが正しいと思います。 何が正しい値なのか考えるきっかけにもなるからね。


おためしようのVBAコード
Dim var As Integer
Dim i As Integer
Dim vstr As String
Dim y As Variant

For y = 2013 To 2020

    Debug.Print y
    
    For i = 2004 To 2012
    
        vstr = CStr(i) + "0327"
        var = Int(DateDiff("d", Format(vstr, "0000/00/00"), Format(CStr(y) + "0327", "0000/00/00")) / 365.25)
    
        Debug.Print vstr + " " + CStr(var)
    Next
Next



どう誤りなのか説明するために時間がかかりますよね。。
twitterこの記事をTwitterでみんなに教える。

投稿者 debizoh : 2013年3月27日 05:36



トラックバック

現在、この記事はトラックバックを受け付けておりません。


コメント

現在、この記事はコメントを受け付けておりません。