Dim AF as double
Dim i as integer
For i = 1 To 10
If AF <= 0.2 Then
AF = AF + 0.02
End If
Next
上記のようにAFを計算すると、
0.02
0.04
0.06
0.08
1.00
0.12000000000000001
0.14
0.16
0.18
0.19999999999999998
となります。
この途中の0.12......と0.1999...を
普通の0.12と0.20と計算させたいのですがどうしたらいいでしょうか?
まず、本当に1.00ってなります?
本題:For〜Nextを使っているのなら、If文がいらない気がしますが。
それ以外に全く処理を行っていなければ特に問題はなさそうだけど、きっと上記以外で余計なことをしているんでしょう。
よけいなことはいっさいしていません。
ちなみに上のコードのみをForm1_Loadに貼って、実行してみてください。
上記のようになりますよ。
> 上記のようになりますよ。
VB6 Sp6で、貼り付けてローカルウィンドウで確認しましたけど、そんな風になりませんでしたよ。
どのようにして確認しているのでしょうか?
それとも、VB6じゃなくて、VB.NETなのかなぁ。。。
# 環境明記しないと再現できないと思うが。。。(OS等も)
すみません。VB.NETです。
> すみません。VB.NETです。
OSとVBのバージョンは?環境といったらここまで書かないと。
それと、
> どのようにして確認しているのでしょうか?
は?
貼り付けただけじゃ、確認できませんけど。
とりあえず、Dobule型は浮動小数点型なので、
2進数で表せれない場合、誤差がでるのは常識ですけど、
> 0.08
> 1.00
> 0.12000000000000001
のようなことはありえません。 (1.00にはならん)
AFをDecimalにするだけでいいんじゃ?
もっと詳しく書くと以下です。
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim AF As Double = 0
Dim i As Integer
For i = 1 To 10
If AF <= 0.2 Then
AF = AF + 0.02
End If
Next
End Sub
下から2行目のNEXTのところにブレークポイントを持ってきて、Watch式で確認しています。
確かにもう一度確認すると、0.10ではなく0.1でした。
ちなみに
Dim AF As Double = 0
を
Dim AF As Decimal = 0
とすると確かに端数はでませんが、数字の最後にDがつきます。
環境はWindowsXP SP2 で、言語はVB.NET 2003です。
よろしくお願いいたします。
Blue さん。
追加です。たびたびすみません、最初の発言で、1.0と書いたのはミスで正しくは0.10と書きたかったのです。
先にも書きましたが、double型は誤差があります。
http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-1.asp
に
<msdn>
浮動小数点
小数点をともなう計算では、浮動小数点、または Decimal(次項で説明)を使うことになります。
VB .NET の浮動小数点は、IEEE754 準拠の浮動小数点であり、一般的なプログラミング言語で利用されています。
IEEE の浮動小数点では、±1.m×2n または ±0.m×2n と表記できる値について、
符号、仮数(m の部分)、指数(n の部分)をビットの並びとして記憶します。
IEEEに限らず、一般的に浮動小数点の小数部分の扱いでは、特に 10 進数表記とは異なるので注意が必要です。
10 進数では、小数点第 1 位が 10 分の 1、第 2 位が 100 分の 1 となりますが、
浮動小数点の仮数(m の部分)は、あるビットが 2 分の 1、その下位のビットが 4 分の 1、
さらに下位が 8 分の 1 となります。そのため、10 進数の小数が浮動小数点で正確に表されるとは限りません。この誤差を浮動小数点の「まるめ誤差」といいます
(IEEE 浮動小数点の正確なビット表現は、値の範囲によって多少変化します。
また、「正の無限大」 や 「負の無限大」、「数でない値」 などが定義されています。
正確なビット表現は、関連ドキュメントを参照してください)。
さらに浮動小数点では、表 3-1 の Single なら有効数字が 7 桁、Double なら有効数字は
15 桁 〜 16 桁程度と、有効桁数が限られています。そのため、財務計算などの桁数の多い計算にはむきません。
桁数の大きい金額の計算には、次に説明する Decimal を使います。</msdn>
とあります。
>数字の最後にDがつきます
これで何か不都合が?
Decimal型の説明は読んだ?
2進数では表現できない小数点があるということも理解しましょう。
Blueさんが懇切丁寧に回答されてますね。
失礼しました。
>名無し 2005/12/11(日) 09:37:24
>まず、本当に1.00ってなります?
ちゃんと読んでくれ。
ありがとうございました。
decimal型とすることで解決しました。
double型が誤差がでるとは知りませんでした。
>Blue 2005/12/11(日) 22:52:59
>とりあえず、Dobule型は浮動小数点型なので、
>2進数で表せれない場合、誤差がでるのは常識ですけど、
ちゃんと読んでくれ。
ツイート | ![]() |