C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Fixで思うような値が返らない


(過去ログ 92 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■54742 / inTopicNo.1)  Fixで思うような値が返らない
  
□投稿者/ インスパイアー (1回)-(2010/11/01(Mon) 00:11:47)

分類:[VB6 以前] 

VB6で開発をしています。
Form上にCommand1ボタンを配置し
Private Sub Command1_Click()
Dim a As Double
Dim b As Long
a = 21.9
b = 195
MsgBox Fix(a * b + 0.5)
End Sub
と言うプログラムを書き実行します。
すると、4271という答えが返って欲しいのですが、4270と返ってきます。
どうしてなのでしょう?
引用返信 編集キー/
■54743 / inTopicNo.2)  Re[1]: Fixで思うような値が返らない
□投稿者/ 魔界の仮面弁士 (1903回)-(2010/11/01(Mon) 08:59:52)
2010/11/01(Mon) 09:03:43 編集(投稿者)

No54742 (インスパイアー さん) に返信
> すると、4271という答えが返って欲しいのですが、
Double 型ではなく、「Currency 型」もしくは「内部処理形式 Decimal の Variant 型」を使いましょう。

> 4270と返ってきます。
> どうしてなのでしょう?

この問題に関して、2 つの注意点があります。

(1) Fix は、型変換を伴いません。
 Double 型を変換した場合、戻り値の型は Double のままです。

(2) Double 型は、データを 2 進小数で管理します。
 そして10進数でいうところの .4や .9 は、2進数では有限の桁数で割り切れません。
 10進数の0.5は、2進数で「0.1」という割り切れる値となりますが、
 10進数の0.4は、2進数で「0.0110011001100110011…」という循環小数であり、
 10進数の0.9は、2進数で「0.1110011001100110011…」という循環小数です。
--------

つまり、a * b というのは、内部的には 4270.5 ではなく、
4270.49999999…に相当する値という事です。
ゆえにそれに 0.5 を足したとて、4271.00 には僅かに足りません。
引用返信 編集キー/
■54813 / inTopicNo.3)  Re[2]: Fixで思うような値が返らない
□投稿者/ インスパイアー (2回)-(2010/11/03(Wed) 10:25:36)
魔界の仮面弁士 さん
レスありがとうございました。
よーくわかりました。今後注意します。
どうもありがとうございました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -