数式結果の丸め誤差の回避(Microsoft Excel)
Nickは、式 “= 0.28100-INT(0.28100)= 0″は、明らかにtrueであっても、Falseを返すことに注意しています。彼は、問題は丸めやコンピューターが2進演算をどのように使用するかなどに関係していると考えています。ニックは式をより大きなIFステートメントの一部として使用しており、Excelには他にも丸め誤差があり、彼に手を差し伸べて噛む可能性があると考えています。 。彼は、このような公式の落とし穴を回避する簡単な方法があるかどうか疑問に思います。
このタイプの問題を回避する簡単な方法を検討する前に、問題が存在する理由を理解することが重要です。 Nickが指摘しているように、それは実際には2進演算とExcelが情報を丸めるという事実と関係があります。舞台裏では、Excelは常に情報を15桁に丸めます。 Nickが使用している計算について考えてみます。
=0.28100-INT(0.28100)=0
Excelが最初にこれを計算するとき、Excelが続く優先順位は次の方法で計算します:
=(0.28100-INT(0.28100))=0
括弧の余分なセットに注意してください。その最後の等号の左側にあるすべての結果は3.55E-15です。これは、次の(長い)式で終わることを意味します。
=0.00000000000000355=0
これは明らかに真実ではありません。そのため、値Falseが返されます。この状況を「修正」する方法はいくつかあります。この場合、おそらく最も簡単なのは、数式を変更してゼロと比較する必要をなくすことです。
=0.28100=INT(0.28100)
ご想像のとおり、この数式はTrueを返します。ただし、これはすべてのニーズに対応できるとは限りません。したがって、問題を回避するためのより良い経験則は、Excelの丸めに決して依存しないことです。これを行うには、次の式で示すように、独自の明示的な丸めを実装します。
=INT(0.28100)-INT(0.28100)=0 =ROUND(0.28100,0)-INT(0.28100)=0 =ROUND(0.28100,5)-ROUND(0.28100,5)=0
このような場合、ゼロなどの特定の値と比較するときに予期しない結果が生じる可能性があるため、Excelが完全な精度で計算を実行することを許可していないことに注意してください。
代わりに、Excelに値(使用しているすべての値)を、比較に必要な精度のレベルに丸めるように強制します。
もう1つのアプローチは、ゼロなどの正確な値との比較を行わないことです。代わりに、比較でいくつかの「ファッジファクター」を考慮してください。これにより、丸めの問題が発生します。たとえば、想定している単位の100分の1の比較が正確である場合にのみ、気にする必要があると判断する場合があります。その場合、元の式は次のように変更できます。
=0.28100-INT(0.28100)<0.01
予想どおり、これはTrueを返します。
_ExcelTips_は、費用効果の高いMicrosoftExcelトレーニングのソースです。
このヒント(8143)は、Microsoft Excel 97、2000、2002、および2003に適用されます。Excel(Excel 2007以降)のリボンインターフェイス用のこのヒントのバージョンは、次の場所にあります。
link数式結果の丸め誤差の回避。