• ベストアンサー

エクセルの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

専門家に質問してみよう