• ベストアンサー

エクセルのROUNDDOWN関数が変??

=ROUNDDOWN((76052441*0.2)-15860003,3) の答えが649514.799になってしまいます。 本来は「649514.8」なのでは?と思います。 どうしてでしょうか?

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

  • ベストアンサー
  • ahirudac
  • ベストアンサー率46% (84/180)
回答No.2

符号の件は置いておくとしまして、これはROUNDDOWN関数に起因するものでは無いようです。 例えばA1に「=76052441*0.2」、B1に「15860003」、C1に「=A1-B1」とするとC1には「-649514.799999999000000」(表示を下15桁にしています)となります。 マイクロソフトのページによれば、これは「Excelの問題や制限よよって生じているものではなく、米国電気電子技術者協会の浮動小数点に関する規格に則り、数値を2進数で格納していることから生じています」だそうです(--;)。 http://support.microsoft.com/kb/813530/ja 困ったものですね。

hamasyou09
質問者

お礼

さっそくありがとうございます。 MSは答えになっていないですよね。 みなさんはこのような件、どのように処理されているのでしょうか? (このような答え(・・・.8)を望む場合)

その他の回答 (6)

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

こんばんは。 >みなさんはこのような件、どのように処理されているのでしょうか 私は、通常、以下のような方法を用います。 =FIXED((76052441*0.2)-15860003,3)*1 これは、文字列から数字を取る方法で「小数点固定法」と呼びます。 次点としては、 =TRUNC(TRUNC(76052441*0.2,3)-15860003,3) >整数として計算して「1.23」なら「123」として計算し、最後で÷100をすれば正解となるということでしょうか? この方法を、「整数変換法」と呼びます。 =(76052441*2-15860003*10)/10 これらは、代表的にプログラミングで使われる方法です。VBなど、多くのプログラミングでも存在しますが、通貨型や10進型によって、その精度を上げるようにします。したがって、VBAのユーザー定義関数を使えば、この問題は回避できますが、あまり万民向けとはいえません。 他には、有効桁数までで、切り捨てたり、四捨五入してしまう方法や、わずかな数を足したり、引いたりする方法がありますが、私は、あまり使いません。このほかにも、時間計算や分数計算の際に、(浮動小数点とは必ずしも違う)丸めが発生しますが、これは、またややこしくします。 ​http://support.microsoft.com/kb/813530/ja​ [XL2003] 小数を使用した計算の誤差について 「この現象はExcel の問題や制限よよって生じているものではなく、米国電気電子技術者協会 (Institute of Electrical and Electronics Engineers, IEEE)754 浮動小数点に関する規格に則り、数値を2進数で格納していることから生じています。」 この話は、ちょっと割り引いて理解したほうがよいです。丸め誤差への補正措置は、今まで、多くの会社が独自に開発し、各社ごとに、パテントがあるのですが、Excelは、オリジナル性が低いので、それらを移行できないまま、「倍精度浮動小数点型(Double)」を生に近い形で、用いているだけの話だと思います。 その仕組みは、奥村春彦先生が書いています。 http://oku.edu.mie-u.ac.jp/~okumura/software/excel/roundoff.html でも、こういうことを知っていないと、きちんとした計算が出来ないとしたら、かなり、使いこなしがあやうくなってしまいます。

hamasyou09
質問者

お礼

みなさんありがとうございます。 単にエクセルなのに、みなさんがこんなに苦労して、単純な正解を求められていたなんて、びっくりです。 いろいろ質問はしたいですが、別の質問で行います。 こういう注意が必要だということでもわかり、大変参考になりました。 何度も何度も、返答頂きましてありがとうございました。 ちなみに、質問をひとつにしておかないと(ポイントをどなたにもつけたいのに)そういう意味で困るということもわかりました。

  • xs200
  • ベストアンサー率47% (559/1173)
回答No.6

非常に大きい数や非常に小さい数を表現するには浮動小数点が適しておりEXCELではこの方式で計算しています。浮動小数点の計算は時間がかかかるのでプロセッサーにはそれ専用の演算ユニットが搭載されています。 浮動小数点方式では数値は近似値で格納されているので丸め誤差が出るのはしかたがありませんが誤差を減らすことはできます。私がお知らせしたのは誤差を減らすための定石です。 扱う数の範囲がせまいのであればVBで10進型や通貨データ型を用いることで誤差はなくせます。

  • xs200
  • ベストアンサー率47% (559/1173)
回答No.5

#3です。 あまりお勧めはしませんが(ツール)(オプション)(計算方法)にある"表示桁数で計算する"のチェックをつければ細工なしでできます。これはブック全体に影響がでるのが勧められない理由です。 先の回答で数値がプラスかマイナスかで処理方法が変わってしまうと言いました。これは自動的にできます。 A1に「=76052441*0.2」、B1に「15860003」、C1に「=A1-B1」としたら =ROUNDDOWN(ABS(C1)+0.0001,3)*SIGN(C1) とすればよいです。roundupはこの逆に考えてください。

hamasyou09
質問者

お礼

みなさんありがとうございます。 この現象は「小数点以下」だけの問題なのでしょうか? つまり、整数として計算して「1.23」なら「123」として計算し、最後で÷100をすれば正解となるということでしょうか? これはまったく的外れでしょうか? みなさん、このような苦労をしているとは知りませんでした。 このようなことを考え処理されているとは驚きです。 VBなどのソフトもそうでしょうか?これは他ソフトでも普通のことなのでしょうか?エクセルを普通に使えるようにするアドインなどはあるのでしょうか?別のフリーエクセルみたいなのを探すほうがいいのでしょうか? 質問が多岐にわたるのでこの質問場所以外で質問すべきでしょうけども。。。この質問を最後として。。

noname#204879
noname#204879
回答No.4

[ANo.2この回答へのお礼]に対するコメント、 》 みなさんはこのような件、どのように処理されているのでしょうか? “小数点を含む計算の場合、端数処理する直前に、必要十分に小さい桁数で四捨五入しておけ”が私の常套手段です。 お示しの例の場合、76052441 に 0.2 を乗じているので、有効桁は小数点以下第一位まで。それより必要十分に小さい桁は小数点以下第五位くらいに考えて、=ROUNDDOWN(ROUND(76052441*0.2-15860003,5),3) とします。 この式の 5 は、例えば 4 でも 6 でも構わないけど、10 では(処理する小数点桁が)小さ過ぎて、効果がありません。

  • xs200
  • ベストアンサー率47% (559/1173)
回答No.3

rounddown関数を使うときには誤差を考慮して計算させます。 今回は答えがマイナスですので0.0001を引いてあげます(rounddownの引数が3なのでその区切りの1/10である0.0001)。プラスの時には0.0001を足してください。 rounddown((76052441*0.2)-15860003-0.0001,3) これで切り捨てられる数字がなくなり正しい数値が出せます。

noname#204879
noname#204879
回答No.1

(76052441*0.2)-15860003=-649514.8 (負数)ですが、貴方はどうして『本来は「649514.8」』(正数)と思うのですか?

hamasyou09
質問者

お礼

記入誤りでした。 -649514.8でした。 ご指摘ありがとうございました。

関連するQ&A

  • EXCELのROUNDDOWN関数について

    いつもお世話になります。 ROUNDDOWN関数で ROUNDDOWN(25/42*1.008,5)という計算式の計算結果が 0.600000となってしまいます。0.599999とならないのが なぜなのかわかりません。 またROUNDDOWN(25/32*1.007,5)では0.78671と小数点第6位が切り捨てられます。 アドバイス宜しくお願い致します。

  • Excelのrounddown関数について

    Excelのrounddown関数について教えてください。 Excel2003でrounddownで0(小数点以下を切り捨て)を入れて計算させた所、例えば、17,600 *0.1=1759となってしまい、1760にはなりません。単純に考えても、電卓で計算しても17,600 *0.1=1760になるはずですが、何故このようになってしまうのでしょうか? 因みに式ですが、=ROUNDDOWN($P4*0.1,0)で、P4(隣のセル)の数値を計算します。 例の場合、P4には3200*5.5の結果が入りますので、ここにも小数点以下の数値は発生しません。 何か設定が違っているのでしょうか?

  • エクセル ROUNDDOWNの切り捨て

    関数式 =ROUNDDOWN((L15/D15-M15)*D15,2)             (57÷25)-2)×25=7.0     =ROUNDDOWN((L15/D15-M15*D15,1)             (57÷25)-2)×25=6.9 なぜ答えは7.0なのになぜ6.9の答えがでるのですか、考えてもわかりません。 在庫表で使用しています。まだ初心者です。 よろしくお願いします。

  • EXCEL関数(ROUNDDOWN)について

    基礎的なことで申し訳ありませんが、EXCEL関数(ROUNDDOWN)について教えて下さい。 現在、EXCEL関数(ROUNDDOWN)について求めている答えが返ってこなくて困っています。 なにか手順を誤っているのでしょうか。  例 : 35,000÷30×12 = 13,999.99999999・・・・ という結果になりますが、      欲しい結果は、「13,999」です。ROUNDDOWN関数を使って求めようとしているのですが、      =ROUNDDOWN(35,000/30*12,0) = 14,000 と切り上がった数値が返ってきます。 また計算結果を文字にして他のセルに貼り付けても「14,000」という数値が表示されます。 また計算結果に少数点以下を表示させても「14,000.0000000」と表示されます。 私のPCがおかしいかと思い他のPCでも同様の処理を行ってみましたが、結果は同じです。 どこの手順が誤っているか、分かりません。どなたかご教授願います。

  • エクセルVBAではRounddown関数はつかえないのでしょうか?

    Excel2003SP2でVBAを使っています。 AAA = RoundDown(Range("A1"), 0) と入力してコンパイルすると 「コンパイルエラー SubまたはFunctionが定義されていません」 と表示されます。 エクセルVBAではRounddown関数は使用できないのでしょうか? それとも私の記述が何か間違っているのでしょうか

  • ROUNDDOWN関数についての質問です

    ROUNDDOWN関数について教えてください。 (1)セルA1に8471.3 , セルA2に 8407.4 という数字を入れて  セルA3に ROUNDDOWN(A1-A2,1)  という式を入れました。結果が63.8になります。  なぜ63.9に答えがならないのでしょうか。  同じ式で桁を減らしてみて  A1に1.3 が A2に 0.4 という数字を入れた場合は  計算結果が0.9 と正しくなります。  あと少しずつ数字を変えていって試してみたら  A1に8471.8 , A2に 8407.4 の計算結果が 64.3 と  なりました。 (2)このROUNDDOWN以外でいい計算式あれば教えてください。

  • ROUNDDOWNでも切り捨てられない?

    2,000,000/2/12*6を電卓で順番に計算すると499,999.999・・・になります。 そこで小数点を切り捨てるため =ROUNDDOWN(2,000,000/2/12*6,3) としたのですが、500,000.000・・・になってしまいます。 499,999.999・・・にするにはどうしたらよいのでしょうか。 もしくは何か誤りがありますでしょうか。 6/2/12*2,000,000と順番を変えると確かに割り切れますので、 順番どおりに計算してくれるかと思い、無理やり =ROUNDDOWN(ROUNDDOWN(ROUNDDOWN(2,000,000/2,3)/12,3)*6,3) としてみましたが、やはり500,000.000・・・になってしまいます。

  • EXCELの関数、INT関数とROUNDDOWN関数の使いわけ

    EXCELの関数、INT関数とROUNDDOWN関数はどういうときに使い分けをするのでしょうか?教えてください。 =INT(8.9)では表示は8 =ROUNDDOWN(8.9,0)では表示は8 と同じ結果が得られますよね。 どういった時に使い分けをするのでしょうか?

  • Excel rounddown関数について

    Excelのrounddown関数について教えてください。 出勤表上で、所定勤務時間(8時間)との差を 小数点以下第3位を切り捨てて、10進法で記載したいのですが うまくいきません。 セルA(始業)→10:15 セルB(終業)→18:30 セルC(休憩)→1:00 セルD(勤務時間)→(数式:=B-A-C)7:15 としており、セルEにセルDで求めた値と所定労働時間の8時間との 差を10進法表記で、小数点以下第3位を切り捨てて入力したく 以下の数式を入れています。 =rounddown(8-(D*24),2) 上記の場合、0.75が解答として正しいかと思いますが、 0.74という解答が返ってきます。 セルDの値を数式ではなく、直接入力すると 正しい値0.75が返ってくるので、セルDを修正する必要が あるのかなと思うのですが、どこを修正すればいいかわからず 途方に暮れています。 初歩的なところで申し訳ありませんが、お知恵を拝借できれば幸いです。 よろしくお願いいたします。

  • rounddownではないのですか?

    エクセル2003です。A1からA5まで計算し、A6に答えが出るとします。その数値が351.5の場合はA7に350に、352の場合も同様に350に、358の場合は360に、358.5の場合も360にならないのでしょうか。A7 のセルにrounddownを挿入したりしたのですが、桁数がよくわからず、351.5のときは351になります。A6に351.5と表示したままA7に350と表示させたいのです。よろしくお願いします。

専門家に質問してみよう