エクセルVBAですが、double型で変数を定義し、-80を代入します。
そこから0.1ずつを引いていきます。すると、途中から桁がおかしくなってしまいます。
(注:別に-80からでなくても、どの値からでも、また、引いていっても足していっても、遅かれ早かれ
どこかから桁がおかしくなってしまいます。)

-80
-80.1
-80.2
…中略
-80.8
-80.8999999999999
-80.9999999999999


といった感じです。
どうしてこのようになってしまうのでしょうか。
また、このようにならないためにはどうしたらよいのでしょうか。

いかにサンプルプログラムを載せます。

------------------------------------------
Sub test()
Dim test As Double
Dim i As Integer

test = -80

For i = 1 To 100
test = test - 0.1
Cells(i, 1) = test
Next i
End Sub

----------------------------------

A 回答 (2件)

端的に言えば、コンピュータの宿命というか、そういう仕様です。


http://d.hatena.ne.jp/satakesatake/20090522/1242 …
など、「浮動小数点」でネット検索してみてください。
人間では、0.1という数字ですが、コンピュータの内部では0.1ではないのです。
回避方法としては、有効桁数 この場合、小数点以下1位
ですので、本来の値を10倍して、整数として計算して、出力時だけ、計算値を10分の1
のDoubleにしてはいかがでしょうか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

浮動小数点の仕組みなんだろうなあと思っていたら、やはり
そうでしたか。

調べてみたら、自己解決しました。

10分の1するのにも、「test*0.1」ではだめで
「test / 10」にすると大丈夫でした。

回答ありがとうございます。

お礼日時:2011/04/12 21:42

浮動小数点型で小数点以下の値を含む場合は基本、誤差を生じます。


ネット検索で「浮動小数点、誤差」で検索すれば詳しい解説が出てきますよ。

対応方法としてはcurrency型やa@のような接尾辞を用いてdecimal型にする(これはかなり古い仕様ですが)あたりでしょうか。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

浮動小数点の仕組みなんだろうなあと思っていたら、やはり
そうでしたか。

調べてみたら、自己解決しました。

10分の1するのにも、「test*0.1」ではだめで
「test / 10」にすると大丈夫でした。

回答ありがとうございます。

お礼日時:2011/04/12 21:43

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


人気Q&Aランキング

おすすめ情報