我正在使用第一种方式,而我的新公司正在使用第二种方式。
double x = 1.99;
double y = 9.02D;
哪一个是正确的,为什么?如果两者都是正确的,那么如何使用它是在不同的情况下?
答案 0 :(得分:9)
来自msdn:
默认情况下,真正的数字文字 作业的右侧 运算符被视为double。 但是,如果你想要一个整数 被视为双重,使用 后缀d或D,例如:复制
double x = 3D;
因此double x = 1.99;
和double y = 9.02D;
答案 1 :(得分:6)
我想说你公司的做法可能更安全。值9.02后的D强制将整数数字(实际)值9.02视为double。
答案 2 :(得分:4)
没有后缀的浮点字面值是double
,因此1.99
和1.99D
(或1.99d
)之间没有区别 - 除了后一种形式明确表示这确实是double
。所以这是一个风格问题,真的。一般来说,你当然应该坚持你公司的风格(除非你有一个非常令人信服的理由说这种风格是“错误的” - 在这种情况下你应该说服公司改变风格,而不是自己默默地违反它; - ))。
答案 3 :(得分: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借来的例子)
答案 4 :(得分:3)
double y = 9.02D;
,后缀D
会将您的数字(实际)值转换为double。如果您希望将整数值转换为double或指定您的值确实为double,则使用此方法。
E.g。
double d = 3D;
PS。正如Sehe所提到的,这会将变量d
转换为double。
var d = 3D;
没有D
后缀,d
可能是int
。
答案 5 :(得分:2)
从风格上讲,当你想要一个整数文字为双精度时,你通常只需要添加'd'或'D':
double d = 1d;
所以在你的例子中,创建double d = 1.99d
是没有意义的,因为编译器已经将1.99分配给double。更何况当你宣布d
时,它的类型也是双倍的。
一般情况下,您无需将d
或D
添加到双重文字中。
然而,在你的情况下,第二个是正确的,因为它是由付钱给你的人选择的风格,最后,这才是真正重要的。
答案 6 :(得分:2)
后缀d很重要,同时使用反射和其他动态用法强制编译器将数字视为double而不是integer,其中double可以包含不带小数的数字。 1.99是完美的双倍。
使用1反射时会产生转换错误。
PropertyInfo p...
p.SetValue(obj, 1)
会抛出错误,但
p.SetValue(obj, 1D)
将正常工作。
var x = 1;
x是int
var x = 1D;
x是双倍的。