すべてのカテゴリ » インターネット・パソコン » ソフトウェア » 使い方・不具合

質問

終了

表計算詳しくないので教えてください。
もともと人がエクセルで作った表を使ってるのですが、
IF(E9="","",$G$5*M9*0.5/"1:0:0")
という式が1列全部に設定されています。(E9とM9だけ行ごとに変わる)
同じ数字のかけざんのはずなのに、2行だけ小数点以下が繰り上げられてしまいます。
(正しくは461のところ、2行だけ462と表示される)
計算式は各行にコピーしたのになぜ表示される計算結果が
2行だけ違うということがおきるのでしょうか?
どうしたら、繰り上げされず、他の行と同じ表示にできますか?

  • 質問者:みかん
  • 質問日時:2009-03-12 09:47:15
  • 2

回答してくれたみんなへのお礼

みなさん、私にとってこんなややこしいものを、親身に考えて頂き、感謝いたします。
ここに質問しなければ解決できていません。
今回、随分とエクセルの勉強になりました。
エクセルって深いんですね・・・
また今後もこちらで質問しようと思います。

本来ならば給与計算等の金銭を扱う計算では、きっちり整数か分数で計算するのがコンピュータでの正しい計算方法です。特に時間表現が入る場合はコンピュータの場合は内部で秒単位か或いはミリ秒単位での大きな数字で管理せざるをえないので、有効な桁数も減ってしまい、表計算ソフト任せの一般向けの時間表現…例えば"1:00:00"等は使わない方が安全であり確実です。

と言うのはコンピュータ内部で管理する数値は二進数(コンピュータ内部では整数です)であったり、浮動小数点計算(誤差を積極的に受け入れるような科学技術計算向きの数値表現です)であったりと人間が認識している数値とは異なった基準の数値が使われます。例えば人間の認識している10進数での0.1は、二進数で取り扱うコンピュータ内部の計算式では無限小数表現になってしまうのです(固定小数でも不動小数でも同じです)。

また計算結果がコンピュータ内部で無限小数になった場合、コンピュータの処理する桁数は有限であるため、どこかで切捨て、切り上げ、四捨五入等の丸め処理が入りますので必ず誤差が発生し、計算を繰り返すほど誤差が累積されて大きくなって行きます。

なので、給与計算や金融計算等の金銭絡みの計算の場合は、途中の計算式は小数が発生しない形式で処理を行い、最終金額決定時点で丸め処理を行うのが普通の方法であり、昔から伝えられている伝統的な手法です。

と、浮動小数点とか固定小数点とか書かれても難しいですよね…御免なさい。理屈ばかりでは解決しないのでエラーの原因を探ってみます。この様な場合、数式を順を追って追跡します。

=IF(E9="","",$G$5*M9*0.5/"1:0:0")
を見ると、行毎に異なるのはE9とM9です。E9は表示形式に影響は無いのでM9に原因があると考えるのが自然です。なのでM9を調べます。

=IF(G9=1,X9+Z9,"")
コレを見ると、X9とZ9の入力はもしかして一般的な時間表現方法の『1:00:00』等となっているのでしょうか。だとすると内部では小数点表現になっていますので計算誤差が発生します。それを裏付ける計算を以下に示しますので、ご覧下さい。例えば

=923*("0:0:1"+"1:0:0")*0.5/"1:0:0"

=923*"1:0:1"*0.5/"1:0:0"
は表示上、同じ数値に見えますが

=923*("0:0:1"+"1:0:0")*0.5/"1:0:0"=923*"1:0:1"*0.5/"1:0:0"
と、何処かのセルに入力してみると答えはFALSEとなり、二つの数値が異なっている事を示します。二つの数値が同一ならばTRUEと表示されます。計算が正しいその証に
=923*"1:0:0"*0.5/"1:0:0"=923*"1:0:0"*0.5/"1:0:0"
と入力するとTRUEと表示されますよね?。人間の計算上では1:00:00+0:00:01は1:00:01で同一に見えますが、コンピュータはダメなのです。

と言う事で表示形式は整数でも、内部では小数になっていますから本来ならば処理(シート)全体を見直す必要があります。しかしそれでは仕事に差し支えるので、とりあえず使えれば良いと言う方針ならば影響の無さそうな所で積極的に誤差丸めを使って誤魔化す手は有ります。

強制的に切捨てにしたいのならばINT関数、四捨五入をしたいのならばROUND関数を使うと良いでしょう。これならば表示形式に関係なく正しく数値を処理できます。ただし先程書いたとおり内部誤差を修正する事は出来ませんが(誤差を四捨五入しても100%の安心が出来る事にはならない)。使い方の詳細はHelpを見てください。

或いは同じ書式設定、同じ数式、同じ数値でも結果が異なってしまうのかは原因が分かりません…恐らくはExcelのバグであろうと思います。何か有れば補足しますので遠慮無くどうぞ。

===補足===
返信&Bestを頂き、有難うございました。

確かにExcelは色々な事が出来るので奥が深いと言うのは当たっているかとは思いますが、コンピュータの本来の姿は自家用車と同様に誰もが簡単に同じ目的に対しては同じ結果を得られるのが理想なので、Excelの様に複雑な物は一長一短とも言えますよね。特に仕事で使いたい時は特にそう感じるかも知れません。

いえいえ、コレだけの事が一発でご理解頂けたのですから、既に『ど素人』の領域は抜け出していますのでご安心ください。一つ事から更に色々と勉強になるので努力していればPCマスター、Excelマスターも近いですよ、益々頑張ってください。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがとうございます。
とりあえず、計算ソフトとして今後も使うのではなく、
今回は書類として一覧表にしたいだけなので、
ROUNDDOWNで数字が合うようにしました。
ど素人なので、これを当てはめるだけでも結構至難でした。
私の「何で?!」という疑問が、上記の説明で随分わかって
スッキリです。

並び替え:

他の方が回答くださっているので
E9="",""について説明します。
結論から言えば<E9が空欄なら空欄>ということです

IF関数ですので
=IF(理論式,真の場合,偽の場合)
なので理論式 E9=""(E9=空欄),真の場合""(空欄),偽の場合$G$5*M9*0.5/"1:0:0"

===補足===
つたない説明でわかりましたでしょうか。
IF関数がわかるようになると関数に興味がわいてくると思います。

話は変わって
まだ説明しきれていない部分があると思います。

X9とZ9及び退勤時間の入力部分とかに式とか入ってませんか?

質問に出てくる461とか462とかがまだ見えてきません。

ぽんこつさんが答えてくれると思ってました。
一度評価してしまうと回答抹消できないので(補足は1回しかできないので)
新たに質問をするか
他の回答者さんが答えてくれるのを待つしかなくなります。

  • 回答者:初心者 (質問から4時間後)
  • 1
この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

なるほど、勉強になります!
それが分かるだけでも違います。
ありがとうございます。

回答にあたり、情報が欲しいので質問させていただきます。

a.「IF(E9="","",$G$5*M9*0.5/"1:0:0")」が入力されているセルの位置
b.セルG5、E9、M9に入力されている値

以上、お伝えいただけたらと思います。
※状況によっては本回答を抹消して再投稿します

===補足===
補足ありがとうございます。おぼろげながら実情が見えてきましたが、原因が特定できませんでした。

 恐らくは、X9かZ9の値(算出結果?)が間違っている、と見ます。時間を計算する場合数式を作る上で注意しないと、変な端数を出す事があります。別な要因も否定できませんので断定はしません。

 回答は他の方に任せる(※)として、追加で以下の点をお伝え頂けないでしょうか?
c.X9とZ9の数式(いずれも出勤時刻と退勤時刻から算出していると想像しますが)
d.「462」と表示される場合の出勤時刻と退勤時刻

X9とZ9が数値ベタ打ちだったら...どうしよ

※ハートはつけないで頂きたかった。投稿を削除して再投稿が出来なくなりました。Sooda!仕様上、補足も1回限りなので当方からのご返答も今回限りとなります。力及ばず済みません。解決しなかった場合は、別の質問として投稿ください。

この回答の満足度
  
とても参考になり、非常に満足しました。回答ありがとうございました。
お礼コメント

ありがたいです><

aについて
Pの列になります

bについて
G5には923
E9には7:00:00 (時間です、7時を入力しています)
M9には =IF(G9=1,X9+Z9,"") 
です。
これは、残業代を計算するために作られたソフトで、
G5の数値は基本の時給、E9が出社時間、M9は深夜労働時間(夜10時以降)
が入るようになっています。
M9の計算式については、X9に午前0時~5時までの勤務時間数が何時間か、
Z9に午後10時~午前0時までの勤務時間数が反映されるようになっています。
G9=1というのは、G9には出勤日は1、休みは0と入力するようになっています。

よろしくお願いします!!

$G$5には日付と時刻が入って、M9には数値がはいっていると思います。
最後に/"1:0:0"となっているのを先に割ってみてください。
($G$5/"1:0:0")*M9*0.5でどうでしょう。
日付型は小数点処理(シリアル値)の問題でそのまま計算するとおかしくなります。
どうにかして、最初に数値に変換する必要があるのです。
やってみてください。

この回答の満足度
  
参考になり、満足しました。回答ありがとうございました。
お礼コメント

やってみましたが解決しません ><(涙)
計算式の記号もよく理解できていないので、勉強になりました。
E9="","",はどういう意味なんでしょうか?
記号を理解する良いサイトとかありますか?

標準ツールバーの【書式のコピー/貼付け】を使います。

①間違っていない(期待している書式になっている)セルをクリック(指定)する。
②標準ツールバー:書式のコピー/貼付け(黄色いハケの絵)をクリック。
   (2箇所以上連続して変更したい箇所があるときはダブルクリック)
③変更したいセルをポイントしてクリック。
   (シングルクリックであれば自動的に終了。複数個所を変更を行う場合は③を繰り返し、Escキーで終了。)

この操作で、セルの書式(桁合わせ、関数による切上げ・切捨ての設定)が統一されると思います。

改善されることを期待します。

  • 回答者:MOUS検定 10級 (質問から27分後)
  • 0
この回答の満足度
  
参考になり、満足しました。回答ありがとうございました。
お礼コメント

やってみましたが解決しません ><(涙)

関連する質問・相談

Sooda!からのお知らせ

一覧を見る