• 締切済み

ExcelのINT関数の計算結果がおかしい。

ExcelのINT関数というよりも表計算ソフトのINT関数で 1, INT((4.645*100-464)*10)の結果は4 2, INT((464.5-464)*10)の結果は5 3, INT((4.745*100-464)*10)の結果は5 4, INT((474.5-464)*10)の結果は5 になってしまいます、これはWIn版Excel2000,2002,2007,Mac版2004 openoffice.org 2.2 google のスプレッドシート ExcelのVBAで同じ結果になりました。VB2005では1も結果が5になります。 ここで検索したところでは表計算ソフトは循環小数になった場合14桁で四捨五入するというようなことが書かれていますが、この場合4.645*10と464.5の違いだけなのでそれも当てはまらないように思えるのですが、また1と3で違いが内容に思えるのですが、どうしてこのようなことが起こるのでしょうか。教えてください。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >表計算ソフトは循環小数になった場合14桁で四捨五入する 確か、Excelの数値は、通常、倍精度型ですから、15桁目までを有効とするのだったと思いますが……。4.645*100-464 では、16桁目が0になっているようです。 ひとことで言えば、浮動小数点丸め誤差の問題です。 この問題は、表計算ソフトというよりも、Microsoft Excel自身の問題で、MSは、他の会社やかつては自社も持っていた補正機能を、Excelには取り入れなかったということです。ややこしいのは、Excelには、他にも、時間などの10進以外の丸めが存在しているので、小数点を扱う場合は、慎重にならざるをえません。私は、MSは、なぜ、補正をしないのか、その理由が分かりません。MSサポートでは、IEEE の浮動小数点フォーマットを理由としていますが、ここらには、何か、会社間の問題が存在しているのかもしれません。 ただ、VB2005は、.Net で、有効桁数が違いますから、それと比較してもどうしようもありません。 Excel VBAなら、あまり、リテラル値で以下のように書くことはしませんが、プログラミングをする人なら、常識的に小数点計算のところで、bのようにCurrency 型にして書きます。小数点を生のまま入れることはしません。 a = Int((4.645 * 100 - 464) * 10)  b = Int((4.645@ * 100 - 464) * 10) で、b は、5になります。 なお、3の数式は、 =INT((4.745*100-474)*10) だと思います。 #1で述べられている日経の芳坂氏の説明は、私には、針小棒大すぎて、正直言って分かりにくいのと、私が読んだときには、どうも記述に、間違いがあるようで、読み切っても煙にまかれたような気がしました。 これは、現在は、Tex などで知られている奥村春彦先生が、以下で触れられています。 http://oku.edu.mie-u.ac.jp/~okumura/software/excel/roundoff.html いずれにしても、ビット計算の話なので、本格的には、プログラミングを学んでいく中やExcelの計算の中で、小数点を扱う場合は、十分に気をつけて、いくつかある補正操作をするしかないかと思います。 今回の場合は、数式の中で小数点の計算をすると問題が見えにくくなってしまいます。 そのために、Excelでは、一応、表示どおりの計算をするという補正オプションは持っているのですが、それを使う人はいませんね。 そこで、私は、Fixed 関数の「小数点固定法(一旦、文字列に換えて、そして切り捨てる)」を用いて、解決しています。これは、主にVBAの技術で、ワークシートでは、Round関数などを使われているようですが、それでも可能だと思います。 他にも、「整数変換法(有効な桁数を整数にして計算する)」があります。もちろん、VBAでは、Currency型で扱うというのは言うまでもありません。 1.と3. の違いは、最近接偶数丸めが、発生しているからだと思います。 例: 1. =INT((FIXED(4.645*100,1)-464)*10) なお、これらで解決しない例として、10進以外の時間計算に特殊な丸め誤差が出てきます。

  • maron--5
  • ベストアンサー率36% (321/877)
回答No.1

◆「演算誤差」によるものではないでしょうか? ★1,の式のセルを指定して数式バーの、4.645*100-464 の部分を反し指定して、F9 を押してください ★0.499999999999943 が表示されます、これでは1,式の結果は「4」になります ★下のURL「◆“達人”芳坂和行氏に学ぶ、エクセル(Excel)「演算誤差」対策講座」が参考になると思います

参考URL:
http://pc.nikkeibp.co.jp/pc21/special/gosa/index.shtml
setotama
質問者

お礼

大変すばやい対応で、良く解りました。 ありがとうございました。

関連するQ&A

  • 四捨五入で計算された数字を、整数で返す関数を教えてください。

    エクセルで見積金額をだす時に、小数点以下非表示で計算すれば、100.4+100.9+100.4=301.7 302となります。 関数を使い小数点第1位四捨五入で、これを301にしたいのです。 小数点第一位を四捨五入して整数で返すと言うのでしょうか? (小数以下斬り捨てだと、300になります。INT関数がそうなのでしょうか?) すみません、関数がまだ良く分かりません。間違っていたり説明がまずかったなら、ごめんなさい。

  • エクセル 計算と表

    エクセルで横方向に1マス右に行くごとに決まった値(356.5や485.3など)が足されていき表として表示される時には1桁の位で四捨五入されるようにしたいのですが(計算は小数点第一位まで計算して表は1の位で四捨五入した物を表示)何か良い方法はないでしょうか?教えて下さい。

  • 2007エクセル計算

    2007のエクセルだとセル幅が狭いと小数点以下が四捨五入されて自動で計算されてしまうので実際の計算結果とは異なってしまいますがどうしたら”#”(2003エクセルだと#で表示される)とかになりますか? 例えば   1.5                2   1.5                2   1.5                2  合計4.5 なのに セル幅が狭いと  合計6  となってしまうのです。

  • エクセルで計算して、例えば小数点第2位まで求めると1.36になった数字

    エクセルで計算して、例えば小数点第2位まで求めると1.36になった数字を 小数点第1位で表示すると四捨五入で1.4となったとします。この数字に1000を 掛けると1360と表示されます。表示されている1.4に1000を掛けるということで 1400と表示するにはどのような関数を使用するのですか。 よろしくお願いします。

  • エクセルの関数

    以下のようなことをエクセルでやりたいのですが 何か関数はありませんか? 例:A×B=答え 上記の答えの 正数が二桁のとき、小数点第二位を四捨五入 正数が三桁のとき、少数点第一位を四捨五入 どなたか教えてください。お願いします。

  • Excelの計算式に詳しい方!

    Excelで掛け算の数式の答えを、小数点以下切り捨てにするにはどうすればいいですか? 例えば、25.5*2515だと 64132.5だから 『64133』と四捨五入にされます。 これを切り捨てにするには、具体的にどんな計算式になりますか? またこのセルの横のセルにも、同じような計算式を並べる表を作るにはどうすればいいですか?

  • エクセルで、表示されたままの値を抜き出すには

    エクセルで、関数を使わずに表示形式の小数点以下の桁数を入れて四捨五入している表があります。 指定している小数点以下の桁数はまちまちで、2だったり0だったりします。 表示されている数値を計算式に使いたいので、見たままの数値が抽出できる方法を探しています。 (ちなみに元々の表は取引先から頂くもので、こちらから「関数を使って四捨五入してください」とはお願いできません)。 どうか回答をよろしくお願い致します。

  • エクセルの表計算の関数について

    いつもお世話になります。 エクセルの関数についてなんですが、A列に金額をいれてB列にそれの消費税を計算させる。=A*0.05 という式をBには入れています。 これで最後に消費税の計をするときれいな数式ならいいんですが、小数点が出た場合トータルが一円とか違ってきてしまいます。 それぞれの計算の時は四捨五入しているのですが、トータルでは小数点で計算してしまうみたいで・・ 表示されてる数字合計がでるようにすればどうすればいいのでしょぅか・・・

  • エクセル関数

    エクセル関数を教えて下さい。 A×B=Cの計算でCが小数点以下の端数が出る場合、 答えのCを小数点以下を四捨五入して整数にする関数を教えて下さい。 CをROUND関数でDという整数に置き換えるのは分かりますが、乗算の答えCを同じセルで整数にしたいです。よろしくお願いします。

  • 計算結果の処理について

    入力された数値に従って、計算をするというスクリプトを作成しています。 計算結果が2.27272727…と続くような場合が出てくるので、 小数点以下第何位を四捨五入するとか、第何位以下を切り捨てるといった数学関数はありますか? 調べてみても、以下3つぐらいしかありませんでした。 Math.ceil() Math.floor() Math.round() 宜しくお願いします。

専門家に質問してみよう