2011-03-27 103 views
9

我正在使用第一种方式,而我的新公司正在使用第二种方式。在c#中表示double的正确方法是什么?

double x = 1.99; 

double y = 9.02D; 

哪一个是正确的,为什么?如果两者都是正确的,那么如何使用这个在不同的场景?

+0

它仅仅是多余的指定d,因为在“”。我有其他公司发明“规则”,但真正的统治者永远是语言。 – 2011-03-27 19:42:56

+0

感谢球员所有积极的结果。 – 2011-03-27 20:16:08

+0

向上投票给大家。祝大家度过愉快的一天。再次感谢:) – 2011-03-27 20:27:01

回答

9

msdn

默认情况下,一个真正的数字文字上 赋值运算符 的右侧被视为双。 但是,如果你想要的整数 被视为双,使用 后缀d或d,例如:复制

双X = 3D;

所以没有差别double x = 1.99;之间double y = 9.02D;

3

double y = 9.02D;,后缀D您的数字(实际)值转换为双。如果您希望将整数值转换为double或指定您的值为的确是的两倍,则使用此值。

例如

double d = 3D; 

Reference

PS。正如Sehe提到的,这会将您的变量d转换为double。

var d = 3D; 

没有D后缀,d将是一个int

+1

或者也许更令人信服'var d = 3D' – sehe 2011-03-27 19:42:35

+0

Thanks Elite :) – 2011-03-27 20:18:55

6

我会说你的公司正在这样做的方式可能更安全。值9.02后的D强制将 整数 数字(实数)值9.02视为双精度值。

+1

9.02不是一个整数值。 – Alan 2011-03-27 19:37:55

+1

'9.02'不是整数值 – 2011-03-27 19:38:22

+0

被拒绝,原因如上述两次。去掉 ? – 2011-03-27 19:44:15

2

风格上,你通常只需要当你想字面整数加一个“d”或“d”是一个双:

double d = 1d;

在你的榜样

因此,使得double d = 1.99d,是毫无意义,因为编译器已经将1.99赋值给double。更不用说当你宣布d时,它的类型也是双倍的。

通常,您不需要将dD添加到双字面值。

然而,在你的情况下,第二个是正确的,因为这是你付钱给你的人选择的风格,最后,这才是真正重要的。

+0

谢谢Alan。 :) +1,因为我将同样的想法传达给我的同事。 :)伟大的人都认为一样。 – 2011-03-27 20:22:36

2

后缀d很重要,同时使用反射和其他动态用法来强制编译器将数字视为double而不是整数,其中double可以包含数字而不包含小数。 1.99是完美的双。

使用反射使用1将导致转换错误。

PropertyInfo p... 

p.SetValue(obj, 1) 

会抛出错误,但是

p.SetValue(obj, 1D) 

将正常工作。

var x = 1; 

x是INT

var x = 1D; 

x是两倍。

+1

至少使用某些格式 – 2011-03-27 19:42:38

+0

对不起,我在iPhone中输入了此内容,iPhone中没有格式支持。 – 2011-03-27 19:43:33

+0

谢谢亨克:)) – 2011-03-27 20:15:22

4

浮点文字没有后缀是double,所以没什么1.991.99D(或1.99d)没有区别 - 除了后者的方式使得它明确的,这确实是一个double。所以这是一个风格问题,真的。总的来说,你当然应该坚持你公司的风格(除非你有一个非常有说服力的理由,认为风格是“错误的” - 在这种情况下,你应该说服公司改变风格,而不是仅仅默默地违反它; - ))。

+0

我喜欢你的幽默感。 :) – 2011-03-27 20:16:51

+1

谢谢 - 但虽然我幽默地表达了它,我也认真对待它。唯一比糟糕的编码风格更糟糕的是缺乏编码风格或不同编码风格的混合:-) – 2011-03-27 20:35:41

+0

是的,你是对的。我以前的公司遭受了很多因为不好的编码风格,或者更好的是不确保所有程序员都遵循相同的代码风格。任何方式,所有程序员的好消息。谢谢 – 2011-03-30 21:33:51

4

对于一个简单的声明,它似乎是无关紧要的。

的“d”后缀可能是情况非常有用,例如这样的:

int n = 10; 
double a = n/3; // 3 
double a = n/3d; // 3.333.. 

但它是一种欠佳无论如何,因为德乙取决于(N)的双隐式转换做除法之前。

同样的道理,如果你传递一个浮动常数所发生的方法有两个重载:

void foo(float bar); 
void foo(double bar); 

你可以区分你要拨打的版本通过调用:

X.foo(3.0D); 

再次,而不是最好的形式。

至于简单的声明,没有速度优势,因为编译器可能会优化它。

(从here借例如)

+0

使用函数解释更容易理解。谢谢。 :) – 2011-03-27 20:19:59

相关问题