コンピュータは小数点以下の計算を苦手とします。
VBAで演算をするとき、小数点以下まで桁がある場合は、変数の型に注意する必要があります。
下図の例では、本来0.01を100個足せば1になるはずですが、変数の型によってはそうならないことを示しています。
|
|
●Long型の場合、小数点以下が抜け落ちる
|
●Single型場合、1にならない
|
Long型は整数を扱う型なので、小数点を含む数値は計算できないのは分かりますが、どうして右側のSingle型で計算しても、1にならないのでしょうか?
これはコンピュータでの数値の扱い方に原因があります。コンピュータはいったん数値を2進数に変換してから計算します。
Single型は数値を単精度浮動小数点数型として扱いますが、0.01は2進数に変換したとき、0.00000010100011110101110000101000…と永遠に続いてしまい、終わりがありません。
このため演算途中で情報落ちが発生しているのです。(数値を扱う型はどれも有限桁数なので)
|
|
●Double型の場合、0.01ならば1になる
|
●しかし0.0001で計算すると誤差がでる
|
しかし同じ演算をDouble型(倍精度浮動小数点数型)で行うと1になります(calc_3)。これはなぜでしょうか?
実は浮動小数点数型の値は、演算の途中で近似値に丸められます。単精度浮動小数点数型では、その丸目誤差が無視できないレベルだったものが、倍精度浮動小数点数型では有効桁数が増えて、無視できるくらい小さな誤差になったためだと思われます。
ちなみに0.01を0.0001に変えて、10000回加算するようにした場合、やはり誤差が出ます(calc_4)。
|
|
●Variant型にしても誤差は解消されない
|
●Currency型は0.0001でも正しく計算される
|
Variant型も小数点を含む演算は、倍精度浮動小数点数型で行われるということなので、同じ結果になります(calc_5)。
最後はCurrency(通貨)型で行った演算結果です。0.0001でもちゃんと1になりました。Currency型は、小数点以下4桁までなら誤差なしで正確な結果を出します。
このことから、金額の計算や正確な計算が求められる場合は、やはりCurrency(通貨)型にする必要があることが分かります。
|