数の扱い:閏年を補正して正確な年齢を求める

このところ出張や会合で勉強する時間がとれず、
あっという間に一週間が過ぎてしまった。

計算の学習をする。数値の扱いはかなり厳密だ。
整数型と少数型が計算式で混在することは許されない。オプショナルの扱いも注意がいる。

学習のネタは、前回の年齢の計算を発展させて、正確に閏年を計算して補正した年齢の計算をすることにした。一年は約365.24日なので端数を補正する必要がある。

閏年が4年に一度あり、百年に一度は閏年でなくなる。
さらに四百年に一度は閏年になる(年齢ではこれは無視)。

計算途中で、オプショナルでnilが入らないようにしないといけない。
肝は、ゼロ(0)で割らないように計算式を作ることのようだ。
割り算が必要な時は、逆数にして掛け算にすればうまくいった(まだ未完成、一日分足りない)。

この計算法だと、閏年の日数分が23.99999999999828となって誤差になり、整数化すると23日になってしまう。
正解は101年と24日なので、違った計算法が必要だ。
うまくできたら、関数にして、次にクラスにしたい(ー>上手くできました)。

正確にオプショナルを設定すればいいのだろうが、まだよく理解していないので今後学習することにして、計算を学ぶ。

*まとめ
・定数や変数にゼロやnilが入る可能性がある計算はエラーになる(とくに割り算)
・整数型と少数型は厳密に区別。混在して計算するとエラーになる。
・整数型は少数型に変換して使用しないと、計算結果が少数を持つ値になる可能性があるとエラーになる。
・letとvarの使い方に注意

(少しは楽しくなってきたかなあ,マド画伯の絵のようだ)^_^)
=====================================
(忘備録)計算の学習
プレイグランド:閏年を補正して正確な年齢を求める
____________________________________________
// Playground - noun: a place where people can play
// 年齢を正確に計算する
// 誕生日をNSDate型に変換して定義
// 時間(秒数)を年数に変換
// 閏年の補正が必要
// yasui_swift
// Xcode7.1 Swift2
// 2015_11_11

import UIKit

var message = "おばあさんはいくつになったかな?"
print(message)


let age = NSDateFormatter()//dateFormatterをageの名前に設定
age.dateFormat = "yyyy/MM/dd"

var myNextBirthday = age.dateFromString("2015/11/16")!//!のつけ忘れに注意
print("次の誕生日は\(myNextBirthday)です")//時間をいれないと0時0分になるー>2015-11-15 15:00:00 +0000

let myBirthday = age.dateFromString("1914/11/16")!
print("誕生日は\(myBirthday)です")//グレゴリオ暦


var myAge = myNextBirthday.timeIntervalSinceDate(myBirthday)
print(myAge/60/60/24/365)//正確な年数。閏年を含んでいるので端数がでる


//閏年計算の自動化
//let yearsCalc = 60*60*24*365//秒数を年数に直す定数
//var myAge3 = myAge/yearsCalc//これはエラーになる(オプショナルのためか?)
//print(myAge3/yearsCalc)//エラー!

let yearsCalc1:double_t = 1/60/60/24/365//逆数にして、nilで割らないようにする

var myAge3 = myAge*yearsCalc1//結果は少数型になる
print(myAge3)

//百年に一度の閏年でない歳の補正
//1年が365.242190日であるので閏年がある.4年に一度が閏年
//百年に一度は閏年ではなくなる(さらに四百年に一度は閏年になる)ための補正
//四百歳は生きないので無視。

if myAge3 >= 100 {

print("年齢は百歳以上です。正確には閏年の補正が必要です。")
myAge = myAge-1*60*60*24
myAge3 = myAge*yearsCalc1
}

//print(myAge3)

var uruDoshi = Int(myAge3/4)//閏年の回数

//百歳以上の閏年の補正
if myAge3 >= 100 {

print("年齢は百歳以上です。正確な閏年の日数補正が必要です。")
uruDoshi = uruDoshi-1
}

var myAge4 = Int(myAge)//秒齢
var myAge4D = Double(myAge4)

var myAge5 = Int(myAge4/60/60/24)//日齢
var myAge6 = Int(myAge4D * yearsCalc1)//年齢_端数の切り捨て:満年齢:整数Integer

//print(myAge3-myAge6)//これでは数字の型が異なりエラーになる

var myAgeD = Double(myAge6)//少数型に変換
//print(myAge3 - myAgeD)//年数の端数を算出
var myAgeDays = 365*(myAge3-myAgeD)//こここでは閏年分が計算される
var myAgeDaysInt = Int(myAgeDays)//整数型に変換

print("年齢は満\(myAge6)歳です")
print("秒齢は\(myAge4)秒です")
print("日齢は\(myAge5)日です")

//正確な年齢を年数と日数で表示したい
//秒は切り捨て、あまりの日数を計算したい

print("---------")

print("正確な年齢は\(myAge6)年と\(myAgeDaysInt)日です(計算誤差が入る可能性あり)")
print("本当の正確な年齢は\(myAge6)年と\(uruDoshi)日です(これが正しいはず)")
______________
____結果________
おばあさんはいくつになったかな?
次の誕生日は2015-11-15 15:00:00 +0000です
誕生日は1914-11-15 15:00:00 +0000です
101.068493150685
101.068493150685
年齢は百歳以上です。正確には閏年の補正が必要です。
年齢は百歳以上です。正確には閏年の日数補正が必要です。
年齢は満101歳です
秒齢は3187209600秒です
日齢は36889日です

                • -

正確な年齢は101年と23日です(計算誤差が入る可能性あり)
本当の正確な年齢は101年と24日です(これが正しいはず)