質問: 42586.73958 と全く同じ関数、引数なのに、ファィルにより計算結果がことなっています。(同じpcです) ※上の42586.75 は2016/8/4 18:00:00のシリアル値 0.010416667は 0:15:00 と入力したセルをc5と参照したところ表示された値です。 業務で使うため、計算結果がことなる理由を把握したいです。 どうぞよろしくお願いいたします。
回答: あまり、大勢の人があれこれ違うことを言ってもしょうがない話ですが、この現象を、浮動小数点(丸め)誤差といいます。 ある意味では、時間丸め誤差といっても過言ではないのは、一般の浮動小数点誤差にはない現象が含まれます。 この浮動小数点誤差は、簡単にいえば、excelは、2進で計算されているからということになるのですが、ベテランの人でも、なかなか気が付きにくい話なのです。 対策自体は、すでに出ている内容ですが、 一体、どうしてこうなったか、それが問題ですよね。 ・2016/8/4 18:00:00 この表示されている日付時間はどうやって作ったか? ドラッグコピーなどで作りませんでしたか? 時間の元の数字というのは、10進からすると無限小数でできていて、それをexcelでは時間表示で人間に分かるように、時間・分・秒で表示されます。その時に丸めているのですが、これを「時間丸め」といって、浮動小数点丸め誤差とは若干違う問題が含まれています。 おそらく、単独で入力したときには、間違いは出ないはずです。ところが、ドラッグコピー(フィルハンドルでドラックして連続した数字を出すこと)したり、時間値の無限小数を足し算・引き算を含め四則演算(今回のfloor関数も含めます)をすると、誤差が生じてしまいます。 元の数値の"18:00:00" は、若干数字が足りなくても、18:00:00と出てしまうのです。だから、[割り切れない数値]の時間値をドラッグコピーしてはいけないのです。 割り切れる数(0.5=30分,0.25=15分) なお、日付は、整数ですから、問題は発生しません。 それでも、ドラッグコピーをしなくては大変だという時もあります。 画像でも分かるかとは思いますが、 =datevalue("2016/8/4")+time(8,1*(row(a1)-1),0) こんな数式を考えてみました。 他にも、値をコピーして、上書きにした後に、区切り位置で、改めて数値にする方法など、さまざまです。 もちろん、単独の場合は、皆様のご指摘の通り、時間文字列に、timevalue関数 や、"8:00"*1 でも、時間の数値になります。 プログラミングでは、整数法や小数点固定法(文字列にして数値に戻す)などがありますが、microsoftでは、round関数を勧めているような気がします。桁数は、必要に応じてですが、私は、昔の経験値で時間に対しては、小数点6桁を丸めるようにしています。 b4: 2016/8/4 08:02:00 =round(b4,5) 42586.334720000000000 01:59.8 足りません。 =round(b4,6) 42586.334722000000000 01:20.0 と差が出てしまいますが、今回のfloor関数では、その問題は出ません。 添付画像では、1分ごとで、1時間中に、正しいのは2つしかありません。後は、全部違ってしまいました。 何かのお役に立てれば幸いです。