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

タイトル Re: 数字の比較について
投稿日: 2017/01/19(Thu) 21:17
投稿者魔界の仮面弁士
そもそも、小数リテラルの記述に問題があります。

「2.3」「2.3#」「2.3R」はいずれも Double 型のリテラルです。
「2.3!」「2.3F」なら Single 型のリテラルとなります。
「2.3@」「2.3D」なら Decimal 型のリテラルです。

ですから本来であれば、最初のコードは
  Dim K As Single
  K = 2.3F
  If K = 2.3F Then
    MsgBox("Kは2.3です")
  Else
    MsgBox("Kは2.3でありません")
  End If
と書くべきだったということです。これなら正しく比較されます。


> If K = 2.3 Then

この場合、K は Single 型、2.3 は Double 型として処理されます。

型は大きい方に丸められますので、結果として
 If K = CSng(2.3R) Then 'これは True
ではなく、
 If CDbl(K) = 2.3R Then 'これは False
として比較されます。



> 計算しなくても誤差が出るというのは驚きというか困りものです

既に指摘されていますが、Single や Double は二進小数です。
(VB6 の通貨型や十進型、VB.NET の Decimal 型は別の管理方法です)


「三分の一」を十進小数で表すと、無限小数になってしまい、誤差が生じますよね。
でも、三進小数なら誤差なく表現できるのです。

同様に「十分の一」という値は、十進小数では問題なく扱えますが、
二進小数では有限桁の小数では表現しきれません。

変数で無限の桁を扱うわけにもいきませんし、Single と Double では
扱える桁数(有効数字の精度)も異なりますので、今回のような差が生じます。

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

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