tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: 桁落ち?
投稿日: 2021/07/23(Fri) 00:37
投稿者魔界の仮面弁士
> Visual Basic6を使用していて
> 下記のプログラムが小数点で8.6と出したいのですが
> 切りのいい数字になってくれません。

Double 型や Single 型は二進小数なので、それは当然ですね。

1 ÷ 2 や 1 ÷ 4 などであれば、二進小数で有限桁となるため、Double に誤差なく格納できます。

1÷10 の結果は、十進小数では有限桁で記録できますよね。
しかし二進小数では循環小数となるため、有限桁では記録できません。

1 ÷ 3 は、三進小数であれば有限桁で問題なく保持できますが、
二進小数や十進小数で保持しようとすると、途中桁で打ち切ることで誤差を含むことになります。

類似の質問として、こちらも参考にしてみてください。
http://hanatyan.sakura.ne.jp/vb60bbs/wforum.cgi?no=16610&reno=16609&oya=16609&mode=msgview&page=0



>  Dim test As Double
>   test = 368.6 - 360

'二進小数のため、誤差を含む
Dim testSingle As Single
testSingle = 368.6! - 360!

'二進小数のため、誤差を含む
Dim testDouble As Double
testDouble = 368.6# - 360#

'十進小数のため誤差はないが、小数点以下4桁までしか保持できない
Dim testCurrency As Currency
testCurrency = 368.6@ - 360@

'十進小数であり、小数点以下の桁数も多いが、その分パフォーマンスが悪い
Dim testDeciaml As Variant
testDeciaml = CDec("368.6") - CDec("360")

'誤差軽減のために十進小数で演算させることが目的なら、
'計算途中で Single や Double を混入させてはいけません。
'数値のデータ型を常に意識してコーディングしましょう。
Debug.Print TypeName(360%)
Debug.Print TypeName(360&)
'Debug.Print TypeName(360^)
Debug.Print TypeName(360!)
Debug.Print TypeName(360#)
Debug.Print TypeName(360@)
Debug.Print TypeName(CDec("360"))
'Debug.Print TypeName(360)
'Debug.Print TypeName(360.0)
Debug.Print TypeName(10 \ 2)
Debug.Print TypeName(10 / 2)

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。