オフィス・ブール ロゴ
【レスキュー連絡先】
代表 : 末永 尚登
TEL: 070-4087-0025 FAX:095-893-6090
4.演算誤差(丸め誤差)について

コンピュータは小数点以下の計算を苦手とします。
VBAで演算をするとき、小数点以下まで桁がある場合は、変数の型に注意する必要があります。
下図の例では、本来0.01を100個足せば1になるはずですが、変数の型によってはそうならないことを示しています。

コード例1結果例1 コード例2結果例2
●Long型の場合、小数点以下が抜け落ちる ●Single型場合、1にならない

Long型は整数を扱う型なので、小数点を含む数値は計算できないのは分かりますが、どうして右側のSingle型で計算しても、1にならないのでしょうか?
これはコンピュータでの数値の扱い方に原因があります。コンピュータはいったん数値を2進数に変換してから計算します。 Single型は数値を単精度浮動小数点数型として扱いますが、0.01は2進数に変換したとき、0.00000010100011110101110000101000…と永遠に続いてしまい、終わりがありません。
このため演算途中で情報落ちが発生しているのです。(数値を扱う型はどれも有限桁数なので)

コード例3結果例3 コード例4結果例4
●Double型の場合、0.01ならば1になる ●しかし0.0001で計算すると誤差がでる

しかし同じ演算をDouble型(倍精度浮動小数点数型)で行うと1になります(calc_3)。これはなぜでしょうか?
実は浮動小数点数型の値は、演算の途中で近似値に丸められます。単精度浮動小数点数型では、その丸目誤差が無視できないレベルだったものが、倍精度浮動小数点数型では有効桁数が増えて、無視できるくらい小さな誤差になったためだと思われます。
ちなみに0.01を0.0001に変えて、10000回加算するようにした場合、やはり誤差が出ます(calc_4)。

コード例5結果例5 コード例6結果例6
●Variant型にしても誤差は解消されない ●Currency型は0.0001でも正しく計算される

Variant型も小数点を含む演算は、倍精度浮動小数点数型で行われるということなので、同じ結果になります(calc_5)。
最後はCurrency(通貨)型で行った演算結果です。0.0001でもちゃんと1になりました。Currency型は、小数点以下4桁までなら誤差なしで正確な結果を出します。
このことから、金額の計算や正確な計算が求められる場合は、やはりCurrency(通貨)型にする必要があることが分かります。



 


オフィス・ブール ロゴ 所在地:長崎県長崎市  代表:末永尚登
E-mail: suenaga@officeboole.com   TEL: 070-4087-0025  FAX: 095-893-6090