1


0

C#2.0ダブルハンドリング-奇妙な動作
Double dblValue = 0.0001;
Boolean a = (dblValue >= (1 / 1000));
Boolean b = (dblValue >= 0.001);
Console.WriteLine("dblValue >= (1 / 1000) is " + a);
Console.WriteLine("dblValue >= 0.001 is " + b);
Console.ReadLine();

上記のC#コードは、「a」をtrueに、「b」をfalseに評価します。 VB.NETでは、同等のコードは「a」をfalseに、「b」をfalseに評価します。 なぜ「a」が真と評価されるのでしょうか?

ここで欠落している暗黙の変換はありますか?そして、なぜそれがVB.NETに影響しないのですか(厳密)?

3 Answer


14


式「1/1000」は、C#の整数演算を使用して評価されるため(実際には無関係ですが、この場合はコンパイル時に)、0に評価されます。 代わりに「1.0」/「1000」^ 1 ^を使用して、「double」演算を強制的に使用します。

VB _always_はhttp://msdn.microsoft.com/en-us/library/25bswc76.aspx [/]に浮動小数点演算を使用しているので、http://msdn.microsoft.com/enを使用する必要があると思います-us / library / 0e16fywh.aspx [\]整数演算を使用して除算を実行したい場合は、異なる動作が見られます。

'' '' '

^ 1 ^または、コメントに従って、「1d」または「(double)1」、またはオペランドのいずれかを「double」型と見なすことを強制する他のものを使用します。


5


1と1000は両方とも整数であるため、結果は整数(この場合は0)になります。 計算を完了するには、倍精度の使用を強制する必要があります。

Boolean b = (dblValue >= ((double) 1/(double) 1000));

or

Boolean b = (dblValue >= (1d / 1000d));

期待する結果が得られます。


2


1/1000は整数式であるため、0が得られます