電子書籍の厳選無料作品が豊富!

エクセルで下記2種類の計算式をいれて計算すると、
答えは両方とも3.355になります。
書式設定で
表示形式-数値-小数点以下の桁数を2にしてみると、
答えが違ってきます。

なぜでしょうか?

=75-(143.84/2)+(0.45/2)+0.05
=3.36

=((143.84/2)-0.225-75)*-1+0.05
=3.35

『表示形式-数値-小数点以下の桁数』この設定は
計算途中で桁数を2にして計算してしまうのでしょうか?

A 回答 (3件)

こんばんは。



>なぜでしょうか?

「浮動小数点誤差丸め」や「IEEE 754」の問題だとか言うよりも、本来は、Excelの欠陥だと思います。何社か表計算の開発会社が、この問題に対処したのにも関わらず、Microsoft は、この問題を放置したのです。簡単に言うと、表計算の代入値の数値を、倍精度浮動小数点型(Double) をそのまま使ってしまったのが原因です。Excelは、後発だけに、パテントの問題が関係したのかもしれません。かつては、IBMの傘下にいた時代には、Microsoft 社もそれに対応はしていたのですが、Windows時代になってやめてしまいました。

決して、その前にも浮動小数点誤差がなかったとは言わないのですが、今よりも軽微でした。

元の数値の
((143.84/2)-0.225-75) の部分が、実際の計算よりも少ないわけです。

 -3.30499999999999
となっています。

ですから、小数点を固定して、例えば、小数点が入って、「ブレ」そうな部分を、FIXED で囲ってあげます。

=FIXED(75-(143.84/2),2)+FIXED((0.45/2)+0.05,3)
=FIXED((143.84/2)-0.225-75,3)*-1+FIXED(0.05,2)

このように、計算すれば正しく出てきます。
これを「小数点固定法」と呼んでいますが、必要な桁の部分までの表示から、数値を求め、それ以下は、切り捨ててしまうという考え方です。INT() や、ROUNDDOWN() や TRUNC() 関数とは考え方が違います。

他にも、全部整数にして計算する「整数変換法」があります。

=(75*100-(143.84*100/2)+(0.45*100/2))/100+0.05
=((143.84*100/2)-0.225*100-75*100)/100*-1+0.05

他には、ROUND 関数や小数点を足して修正することもありますが、概して、これは、小数点を含む場合には、誤差が出そうだと勘を働かせるしかありません。求める桁の範囲をくくるという考え方をすれば、問題は減ります。
    • good
    • 0

ダブり回答ですが



小数点以下14桁にすると両者の違いがみえる。

3.35500000000000
3.35499999999999

これを小数点以下2桁で「表示」すると、小数点以下3桁目で四捨五入し
3.36
3.35
となった。これEXCEL式。
小数点以下3桁なら両者とも
3.355

No.2さんの解説でナンデ?がはっきりした。この場でお礼をいいます。
    • good
    • 0

演算誤差のためです。

演算誤差はURLを参考にしてください。

ちなみに、小数点以下の桁数を大きく(14以上)すると、
Excelの計算結果としての数値が表示されるハズです。
これを小数点以下の桁数を2桁として、四捨五入するため、
答えが違ってきます。

参考URL:http://pc.nikkeibp.co.jp/pc21/special/gosa/index …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!