2010-07-27 62 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(); 

上述C#代码将'a'评估为true,将'b'评估为false。在VB.NET中,等效代码将'a'评估为false,将'b'评估为false。为什么'a'评估为真?C#2.0双重处理 - 奇怪行为

是否存在隐式转换我在这里丢失 - 为什么它不影响VB.NET(严格)?

回答

14

表达1/1000使用在C#整数运算进行评估(在这种情况下编译时,虽然它确实无关),所以计算结果为0。使用1.0/1000 代替强制double算术使用。

我相信,VB 总是使用浮点运算为/,你必须使用\,如果你想使用整数运算,这就是为什么你看到不同的行为没有进行分割。


或者,按照注释,使用1d(double) 1或其他任何东西,这将迫使两个操作数被认为是double类型。

+3

或者在两个参数中附加一个'd'来明确地使它成为双精度。 – Joey 2010-07-27 13:52:23

+0

闪亮。谢谢 :) – Rushyo 2010-07-27 14:19:37

2

因为1/1000是整数表达式,产生0

5

1和1000均为整数,所以其结果将是(在此情况下0)的整数。你需要强制使用双打来完成数学。

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

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

会给你你期待的结果。