タイトル : 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 では 扱える桁数(有効数字の精度)も異なりますので、今回のような差が生じます。 |