エクセルの演算で#NUM!とエラーが出る理由

このQ&Aのポイント
  • エクセルでACOS関数を使用し、セルの計算結果が#NUM!となるエラーが発生しました。同じ小数点一桁の計算なのに、なぜ結果が出ないのか不思議に思っています。解決方法を教えてください。
  • エクセルの演算機能を使用している中で、ACOS関数の計算結果が#NUM!となりました。同じような小数点一桁の計算であるにもかかわらず、なぜ結果が出ないのか疑問です。どなたか解決方法をご存じの方がいらっしゃいましたら、教えてください。
  • Windows7でエクセルを使用しています。ACOS関数の計算結果が#NUM!となり、なぜ同じような計算でも結果が出ないのか疑問です。解決方法をご存じの方がいらっしゃいましたら、教えていただけると助かります。
回答を見る
  • ベストアンサー

エクセルにてacosを使い#NUM!とエラー

質問させていただきます。 エクセルの演算機能にてですが、 D4:-28.2 D5:-33   F5:4.8 D6:=D5-D4    F7:DEGREES(ACOS(D6/F5)) と入力したところF7に#NUM!とエラーが出てしまいます。 D5-D4=4.8となりF7には180と出る予定なのですが、出ません。 これが、D5:-33.4、F5:5.2と入力するとF7に180と出力されます。 同じ、小数点一桁同士の計算なのにどうして前者は結果が出ないのでしょうか? 一応、D6にROUNDを追加することで解決はしましたが、気になって仕方ありません。 わかる方いましたら、教えてください。 なお、使用しているのはwindows7です。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8518/19364)
回答No.2

>同じ、小数点一桁同士の計算なのにどうして前者は結果が出ないのでしょうか? 二進数では「0.1」は「循環小数」になります。 二進数の世界では、小数点以下は「1/2」「1/4」「1/8」「1/16」「1/32」「1/64」などを足し合わせた数で表現します。 なので「0.5」とか「0.25」とか「0.125」は「誤差無しで記憶できる」のですが「0.1」は、どうしても誤差が出てしまいます。 この誤差は「0.1と入力すると、内部的に0.1じゃない数が記録されるけど、画面には0.1と表示される」と言う事からも判るように「目で見ても判らない」のです。 D4:-28.2 D5:-33 では、引き算した結果は「見えない誤差を含む」のです。 一方、 D4:-28.2 D5:-33.4 では、引き算した結果は「見えない誤差を含む」のは同じですが、誤差の「向き」が違います。 この「誤差の向き」が、ACOSに成功するか失敗するかを決定しています。 空いているセルに =(D6+F5) と入力してみてください。括弧付きの式にしているのが肝要です。 正負が違うだけで、絶対値が同じ値を足せば、0になる筈ですが、0になりません。 D4:-28.2 D5:-33 F5:4.8 の場合、結果が -8.9E-16 (-8.9×10の-16乗、を意味します。-0.00000000000000089です) と表示されます。 これは「D6の値が、-4.8よりも、誤差分だけ小さい」と言う事を意味します。 負の数なので、言い換えれば「-4.8よりも、誤差分だけ、0から遠い」のです。 ほんのちょっとだけ「-4.9の方に寄っている」のです。 なので「D6/F5」の割り算をすると、割り算の結果は「ほんのちょっとだけ、-1からズレて、-1.1の方に寄っている」のです。 ACOSの引数は「-1~1」に限られ、この範囲を逸脱すると「#NUM!」になります。 割り算の結果が「ほんのちょっと1.1の方に寄っている」って事は「-1~1からハミ出している」って事です。 一方、 D4:-28.2 D5:-33.4 F5:5.2 の場合、 =(D6+F5) の結果が 8.88E-16 になります。 これは「D6の値が、-4.8よりも、誤差分だけ大きい」と言う事を意味します。 負の数なので、言い換えれば「-4.8よりも、誤差分だけ、0に近い」のです。 ほんのちょっとだけ「-4.7の方に寄っている」のです。 なので「D6/F5」の割り算をすると、割り算の結果は「ほんのちょっとだけ、-1からズレて、-0.9の方に寄っている」のです。 この値は、ACOSの引数の条件「-1~1」に一致していますから、正常に表示されます。 >一応、D6にROUNDを追加することで解決はしましたが、気になって仕方ありません。 計算結果が小数点以下第1位までで良いなら、D6を =VALUE(TEXT(D5-D4,"#.#")) にして下さい。 小数点以下第5位までなら =VALUE(TEXT(D5-D4,"#.#####")) にします。 これは「一旦、文字列にして、文字列を数値に変換する」と言う意味です。 セルに「4.8」と値を打ち込むと、内部的に「4.8と言う文字列を受け取って、文字列を数値に変換する」と言う処理をして、数値を記録します。 上記の式も「文字列を数値に変換する」と言う事をするので「誤差が消えて、直接に値を入力したのと同じ結果」が得られます。 このようにすると、計算結果のセルと値入力したセルの誤差が消えて =(D6+F5) の結果が「0」と表示される筈です。 こう表示されれば「誤差無し」って事なので、ACOSも失敗しません。

yochimochi
質問者

お礼

とても分かりやすかったです! なんとなくNUM!が出るということは、1~-1の値に入っていないんだろうとは考えてましたが 、、、 二進数の誤差の関係だったのですか、、、 非常にわかりやすく、解決案も出していただいて助かりました! ありがとうございます。

その他の回答 (1)

  • mindatg
  • ベストアンサー率48% (110/227)
回答No.1

浮動小数点の誤差ってやつです。 -4.8/4.8=-1と表示されていても内部的には -1.000000000000000000000000001 みたいな値になっています。 ACOS()のように値の範囲が-1~1 みたいな関数だと、-1より小さい為エラーになっちゃうんです。 Excel で浮動小数点演算の結果が正しくない場合がある http://support.microsoft.com/kb/78113/ja 下記なんかが比較的簡単に説明されています。 小数計算で発生する「誤差」―― 単純な計算の答えが合わない理由 http://pc.nikkeibp.co.jp/pc21/special/gosa/eg1.shtml

yochimochi
質問者

お礼

迅速な対応ありがとうございます。 リンク先も見ましたが非常にわかりやすかったです。 エクセルにて小数点以下の計算をし小数点の表示桁数を変えたところ上記のようになりました。 大変勉強になりました。 ありがとうございます。

関連するQ&A

  • Excelで文字列の数式の結果を表示するには?

    過去ログ等調べたのですが、ぴったりくるものがなかったので質問させてください。 Excelで文字列として数式を入力して、 別のセルで計算結果を小数1桁でroundして表示させたいです。 数式は四則演算と( )です。 ファイルを共有しているので、アドインは使いたくないのですが、何かいい方法はあるでしょうか? よろしくお願いします。

  • エクセルについて

    すみません。つい先日下記質問をしました。 追加で質問をしたかったのですが、追加の仕方が分かりませんでした。 結局、教えてもらったところ以外にもおかしなところがありましたので 教えてください。 エクセル関数でわからないところがあるので、教えてください。 Round関数で、四捨五入の小数点以下の表示を切っています。 そうすると、その合計を取ると、実際は表示は小数点以下が 切れていても、元の数字は小数点が残っているので 合計を出した時に端数が合いません。 F列に下記の式が入っています。 =ROUND(D5,2)*E5 このD5に当たる個所が、小数点表記になっています。 F列の集計を取ると、数字のは数が合いません。 わかる方、教えてください。よろしくお願いいたします。

  • エクセルデータのワードへの差し込み

    エクセルでラウンド関数で小数点を2桁に設定し計算させたものをワードに差し込んだのですが、設定した二桁の小数点以下に数字が表示されてしまいます。解決方法を教えて下さい。

  • EXCELの小数計算について

    EXCEL97で小数計算をすると誤差がでるのですが何故ですか? A列に14.60を数値入力  B列に13.90を数値入力  C列に=B1-A1の数式をいれると-0.70となるはずなのにどういうわけか -0.699999999999999と表示される。 小数点以下14桁目までは-0.70000000000000と表示されるが15桁目で上記のように表示される。 表面上はROUND関数などで処理できるのですが複数の数式を組み合わせて計算している時は-0.69999・・・の数値をもって計算される場合があり誤差がでる。 消費税や金利計算などで1円でも誤差がでると表計算の正確さが問われてしまう。 0.7の他にも 次の場合もでる 0.2のとき0.1999・・ 0.3のとき0.2999・・・・ 0.8のとき0.7999・・・・ これはEXCELのバグなのでしょうか?

  • 複数の数字を計算

    下記のプログラムだと、 1 tasu 1 tasu 1 tasu 1 tasu 1 をしても答えは2となります。 入力された数字を一気に計算できる方法を教えて下さい。 また、必ず5の値を入力しなくては、いけないのでは無くて、5つ以下ならOKにしたいです。 コマンドプロンプト上で自ら入力し動くプログラムを作成中です。 例: 1 tasu 1 tasu 1 tasu 1 tasu 1  答え5      1 tasu 1 tasu 1 答え3 /*演算子チェックと演算実行*/ if (args[1].equals("tasu")){ /*演算子チェック*/ ans1 = num1 + num2; }else if (args[1].equals("hiku")){ /*演算子チェック*/ ans1 = num1 - num2; /* hiku 演算実行*/ }else if (args[1].equals("kake")){ /*演算子チェック*/ ans1 = num1 * num2; /* kake 演算実行*/ }else if (args[1].equals("waru")){ /*演算子チェック*/ if(num2 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num1); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num2); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子1: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[3].equals("tasu")){ /*演算子チェック*/ ans1 = num2 + num3; }else if (args[3].equals("hiku")){ /*演算子チェック*/ ans1 = num2 - num3; /* hiku 演算実行*/ }else if (args[3].equals("kake")){ /*演算子チェック*/ ans1 = num2 * num3; /* kake 演算実行*/ }else if (args[3].equals("waru")){ /*演算子チェック*/ if(num3 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num2); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num3); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子2: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[5].equals("tasu")){ /*演算子チェック*/ ans1 = num3 + num4; }else if (args[5].equals("hiku")){ /*演算子チェック*/ ans1 = num3 - num4; /* hiku 演算実行*/ }else if (args[5].equals("kake")){ /*演算子チェック*/ ans1 = num3 * num4; /* kake 演算実行*/ }else if (args[5].equals("waru")){ /*演算子チェック*/ if(num4 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num3); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num4); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子3: kake waru tasu hiku の中から入力して下さい"); } /*演算子チェックと演算実行*/ if (args[7].equals("tasu")){ /*演算子チェック*/ ans1 = num4 + num5; }else if (args[7].equals("hiku")){ /*演算子チェック*/ ans1 = num4 - num5; /* hiku 演算実行*/ }else if (args[7].equals("kake")){ /*演算子チェック*/ ans1 = num4 * num5; /* kake 演算実行*/ }else if (args[7].equals("waru")){ /*演算子チェック*/ if(num5 == 0){ /*0算チェック*/ System.out.println("0で割ろうとしました"); }else{ BigDecimal bd1 = new BigDecimal(num4); /* waru 演算実行*/ BigDecimal bd2 = new BigDecimal(num5); BigDecimal bd3 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);/*小数点第3位四捨五入、小数点第2位まで表示の割り算*/ } }else{ System.out.println("演算子4: kake waru tasu hiku の中から入力して下さい"); }

    • ベストアンサー
    • Java
  • エクセルの計算について質問です

    エクセルの計算について質問です 数値の計算で、電卓で算出した値とエクセルで計算した値とが異なり困ってます。 【計算内容】 A(整数) × B(小数部2桁) = C(整数) ※Cは小数点以下切捨てとしたい ※エクセル計算ではROUNDDOWNを使用 【実際の計算結果】 (1)10,000,010,000.00 × 9999.99 = エクセル:99,999,999,999,999、電卓:99,999,999,999,999 (2)10,000,010,000.01 × 9999.99 = エクセル:100,000,000,000,000、電卓:99,999,999,999,999.9999 (1)は電卓とエクセルで結果は一致しますが、(2)は一致しません。 エクセルで小数点以下第4位が丸められてるようです。 【エクセルで算出したい値】 (2)ではDに999,999,999,999と出力したいです。 関数INTやROUNDDOWNを使ってみたのですが、うまくいきませんでした。 セルCの書式設定と、どの関数を使用すればよいのか教えていただけると大変助かります。

  • ここ数日Num lockがオンになります。

    東芝ダイナブックAX/53D vista。エレコムのテンキーを外付けしています。 使い始めて半年過ぎています。 数日前入力している時に、平仮名が規則正しい数字になってしまって、 驚きました。 サポートを受け、Num Lockについて知りました。 知らないうちにキーボードを、(FNキー・F11)触ったのかなと、思っていたのですが、 気をつけていますが、何もしないのに、入力途中で、Num Lookがオンに、なってしまいます。 時々Num Lockのランプが点滅したり、そのまま、点灯しています。 オフにしようと、、(FNキー・F11)を、押しても反応しない時もあります。 やはり故障したのでしょうか? パソコン機種とテンキーの相性も悪い場合があるという事ですので、 エクセル以外の時はそれを、はずしています。

  • エクセルの計算

    エクセルの計算についてなのですが、書式の設定で表示を小数以下30桁まで表示するに設定したのですが、実際式を入力して実行しても小数第14桁くらいまでは表示するのですが15位以降は0000…となってしまいます。 これは機能上しょうがないのですか? それとも他に設定する部分があるのですか?

  • 計算に使うエクセルの数値の表し方について

    初歩的な質問かもしれませんが… エクセルのセル間で、計算式や関数を使って計算を行うと、答えが6.10479547238…などと割り切れない小数になることが多いです。 これを、例えば小数点以下3桁で表示させるには、書式の表示形式を数値にして桁数を3で指定する方法と、ROUND関数を用いて引数を3にするやり方が考えられます。 この計算結果の数値を用いて、さらに別の計算を行う場合(例えば各計算結果の平均値を出すなど)、どちらのやり方で丸めたものを用いた方が正確でしょうか?

  • 小数の四捨五入

    お世話になります。 タイトルのとおりなのですが、ただ0.2332232…みたいな小数ではなく、 DBから取得した小数で、 2.46674e+007 のような感じで後ろに+~という文字がついてしまっている小数の四捨五入の仕方です。 これをroundで四捨五入すると、0になってしまいます。 // $float_numが2.46674e+007だとして // 小数第3位まで取得 $float_num = round($float_num,3); 出力結果:24667400 2.467という値を取得したいです。 どうかご教授いただけないでしょうか。

    • ベストアンサー
    • PHP