タイトル : 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) |