2010-07-27 11 views
1
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(); 

Le code C# ci-dessus évalue 'a' à true et 'b' à faux. Dans VB.NET, le code équivalent évalue 'a' à false et 'b' à false. Pourquoi "a" évaluerait-il vrai?Double manipulation C# 2.0 - Comportement bizarre

Y a-t-il une conversion implicite qui me manque ici - et pourquoi cela n'affecte-t-il pas VB.NET (Strict)?

Répondre

14

L'expression 1/1000 est évaluée (au moment de la compilation, dans ce cas, bien qu'il soit sans rapport vraiment) en utilisant une arithmétique entière en C#, donc évaluée à 0. Utilisation 1.0/1000 au lieu de forcer double arithmétique à utiliser.

Je crois VB toujours utilise arithmétique en virgule flottante pour /, et vous devez utiliser \ si vous souhaitez effectuer la division en utilisant l'arithmétique entière, ce qui est la raison pour laquelle vous voyez le comportement différent là-bas.


Ou, selon les commentaires, utilisez 1d ou (double) 1 ou toute autre chose qui forcera l'une des opérandes à considérer comme étant de type double.

+3

Ou ajoutez un 'd' à l'un ou l'autre des arguments pour en faire explicitement un double. – Joey

+0

Brillant. Merci :) – Rushyo

2

Parce 1/1000 est une expression entière, ce qui donne 0

5

1 et 1000 sont tous deux des nombres entiers, de sorte que le résultat sera un entier (0 dans ce cas). Vous devez forcer l'utilisation de doubles pour compléter les calculs.

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

ou

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

vous donnera le résultat que vous attendez.