小数点の計算できちんと表示させるには?

解決


shell  2005-12-11 16:31:45  No: 93153

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と計算させたいのですがどうしたらいいでしょうか?


名無し  2005-12-11 18:37:24  No: 93154

まず、本当に1.00ってなります?

本題:For〜Nextを使っているのなら、If文がいらない気がしますが。
それ以外に全く処理を行っていなければ特に問題はなさそうだけど、きっと上記以外で余計なことをしているんでしょう。


shell  2005-12-12 07:25:26  No: 93155

よけいなことはいっさいしていません。
ちなみに上のコードのみをForm1_Loadに貼って、実行してみてください。
上記のようになりますよ。


Blue  2005-12-12 07:30:50  No: 93156

> 上記のようになりますよ。
VB6 Sp6で、貼り付けてローカルウィンドウで確認しましたけど、そんな風になりませんでしたよ。
どのようにして確認しているのでしょうか?
それとも、VB6じゃなくて、VB.NETなのかなぁ。。。
# 環境明記しないと再現できないと思うが。。。(OS等も)


shell  2005-12-12 07:37:15  No: 93157

すみません。VB.NETです。


Blue  2005-12-12 07:44:45  No: 93158

> すみません。VB.NETです。
OSとVBのバージョンは?環境といったらここまで書かないと。

それと、
> どのようにして確認しているのでしょうか?
は?
貼り付けただけじゃ、確認できませんけど。


Blue  2005-12-12 07:52:59  No: 93159

とりあえず、Dobule型は浮動小数点型なので、
2進数で表せれない場合、誤差がでるのは常識ですけど、

> 0.08
> 1.00
> 0.12000000000000001
のようなことはありえません。 (1.00にはならん)


medaka  2005-12-13 02:34:54  No: 93160

AFをDecimalにするだけでいいんじゃ?


shell  2005-12-13 09:25:59  No: 93161

もっと詳しく書くと以下です。

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です。
よろしくお願いいたします。


shell  2005-12-13 09:28:57  No: 93162

Blue さん。
追加です。たびたびすみません、最初の発言で、1.0と書いたのはミスで正しくは0.10と書きたかったのです。


Blue  2005-12-13 10:07:07  No: 93163

先にも書きましたが、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>
とあります。


あっきー  2005-12-13 10:25:32  No: 93164

>数字の最後にDがつきます
これで何か不都合が?
Decimal型の説明は読んだ?
2進数では表現できない小数点があるということも理解しましょう。


あっきー  2005-12-13 10:27:26  No: 93165

Blueさんが懇切丁寧に回答されてますね。
失礼しました。


名無し  2005-12-13 10:39:18  No: 93166

>名無し 2005/12/11(日) 09:37:24
>まず、本当に1.00ってなります?

ちゃんと読んでくれ。


shell  2005-12-22 09:02:48  No: 93167

ありがとうございました。
decimal型とすることで解決しました。
double型が誤差がでるとは知りませんでした。


名無し  2005-12-22 14:30:21  No: 93168

>Blue 2005/12/11(日) 22:52:59
>とりあえず、Dobule型は浮動小数点型なので、
>2進数で表せれない場合、誤差がでるのは常識ですけど、

ちゃんと読んでくれ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加