- ベストアンサー
エクセルのROUNDDOWN関数が変??
=ROUNDDOWN((76052441*0.2)-15860003,3) の答えが649514.799になってしまいます。 本来は「649514.8」なのでは?と思います。 どうしてでしょうか?
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
符号の件は置いておくとしまして、これはROUNDDOWN関数に起因するものでは無いようです。 例えばA1に「=76052441*0.2」、B1に「15860003」、C1に「=A1-B1」とするとC1には「-649514.799999999000000」(表示を下15桁にしています)となります。 マイクロソフトのページによれば、これは「Excelの問題や制限よよって生じているものではなく、米国電気電子技術者協会の浮動小数点に関する規格に則り、数値を2進数で格納していることから生じています」だそうです(--;)。 http://support.microsoft.com/kb/813530/ja 困ったものですね。
その他の回答 (6)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >みなさんはこのような件、どのように処理されているのでしょうか 私は、通常、以下のような方法を用います。 =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 でも、こういうことを知っていないと、きちんとした計算が出来ないとしたら、かなり、使いこなしがあやうくなってしまいます。
お礼
みなさんありがとうございます。 単にエクセルなのに、みなさんがこんなに苦労して、単純な正解を求められていたなんて、びっくりです。 いろいろ質問はしたいですが、別の質問で行います。 こういう注意が必要だということでもわかり、大変参考になりました。 何度も何度も、返答頂きましてありがとうございました。 ちなみに、質問をひとつにしておかないと(ポイントをどなたにもつけたいのに)そういう意味で困るということもわかりました。
- xs200
- ベストアンサー率47% (559/1173)
非常に大きい数や非常に小さい数を表現するには浮動小数点が適しておりEXCELではこの方式で計算しています。浮動小数点の計算は時間がかかかるのでプロセッサーにはそれ専用の演算ユニットが搭載されています。 浮動小数点方式では数値は近似値で格納されているので丸め誤差が出るのはしかたがありませんが誤差を減らすことはできます。私がお知らせしたのは誤差を減らすための定石です。 扱う数の範囲がせまいのであればVBで10進型や通貨データ型を用いることで誤差はなくせます。
- xs200
- ベストアンサー率47% (559/1173)
#3です。 あまりお勧めはしませんが(ツール)(オプション)(計算方法)にある"表示桁数で計算する"のチェックをつければ細工なしでできます。これはブック全体に影響がでるのが勧められない理由です。 先の回答で数値がプラスかマイナスかで処理方法が変わってしまうと言いました。これは自動的にできます。 A1に「=76052441*0.2」、B1に「15860003」、C1に「=A1-B1」としたら =ROUNDDOWN(ABS(C1)+0.0001,3)*SIGN(C1) とすればよいです。roundupはこの逆に考えてください。
お礼
みなさんありがとうございます。 この現象は「小数点以下」だけの問題なのでしょうか? つまり、整数として計算して「1.23」なら「123」として計算し、最後で÷100をすれば正解となるということでしょうか? これはまったく的外れでしょうか? みなさん、このような苦労をしているとは知りませんでした。 このようなことを考え処理されているとは驚きです。 VBなどのソフトもそうでしょうか?これは他ソフトでも普通のことなのでしょうか?エクセルを普通に使えるようにするアドインなどはあるのでしょうか?別のフリーエクセルみたいなのを探すほうがいいのでしょうか? 質問が多岐にわたるのでこの質問場所以外で質問すべきでしょうけども。。。この質問を最後として。。
[ANo.2この回答へのお礼]に対するコメント、 》 みなさんはこのような件、どのように処理されているのでしょうか? “小数点を含む計算の場合、端数処理する直前に、必要十分に小さい桁数で四捨五入しておけ”が私の常套手段です。 お示しの例の場合、76052441 に 0.2 を乗じているので、有効桁は小数点以下第一位まで。それより必要十分に小さい桁は小数点以下第五位くらいに考えて、=ROUNDDOWN(ROUND(76052441*0.2-15860003,5),3) とします。 この式の 5 は、例えば 4 でも 6 でも構わないけど、10 では(処理する小数点桁が)小さ過ぎて、効果がありません。
- xs200
- ベストアンサー率47% (559/1173)
rounddown関数を使うときには誤差を考慮して計算させます。 今回は答えがマイナスですので0.0001を引いてあげます(rounddownの引数が3なのでその区切りの1/10である0.0001)。プラスの時には0.0001を足してください。 rounddown((76052441*0.2)-15860003-0.0001,3) これで切り捨てられる数字がなくなり正しい数値が出せます。
(76052441*0.2)-15860003=-649514.8 (負数)ですが、貴方はどうして『本来は「649514.8」』(正数)と思うのですか?
お礼
記入誤りでした。 -649514.8でした。 ご指摘ありがとうございました。
お礼
さっそくありがとうございます。 MSは答えになっていないですよね。 みなさんはこのような件、どのように処理されているのでしょうか? (このような答え(・・・.8)を望む場合)