C# と VB.NET の質問掲示板
ASP.NET、C++/CLI、Java 何でもどうぞ
C# と VB.NET の入門サイト
Re[2]: Fixで思うような値が返らない
(過去ログ 92 を表示中)
掲示板トップ
C# と VB.NET 入門
新規作成
利用方法/規約
トピック表示
ランキング
記事検索
過去ログ
[トピック内 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
-