タイトル | : Re^2: 桁落ち? |
記事No | : 16614 |
投稿日 | : 2021/07/23(Fri) 13:42 |
投稿者 | : M |
> > 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)
ありがとうございました。下記で試して見ます。 '十進小数であり、小数点以下の桁数も多いが、その分パフォーマンスが悪い Dim testDeciaml As Variant testDeciaml = CDec("368.6") - CDec("360")
|