【发布时间】:2009-10-17 02:21:40
【问题描述】:
在 Java 中,无论是否使用“.0”,在双操作中编写常量都更容易接受?
如,
双变量= 200.0; 双 d= var/250.0; 双 h= 1.0 - d;
对比
双变量= 200; 双 d= var/250; 双 h= 1 - d;
谢谢
【问题讨论】:
标签: java coding-style double notation
在 Java 中,无论是否使用“.0”,在双操作中编写常量都更容易接受?
如,
双变量= 200.0; 双 d= var/250.0; 双 h= 1.0 - d;
对比
双变量= 200; 双 d= var/250; 双 h= 1 - d;
谢谢
【问题讨论】:
标签: java coding-style double notation
这与风格本身无关。当你写double var = 200;时,200是一个integer literal,然后通过widening primitive conversion转换成double。
最好具体一点——如果你使用双精度常量,就写成双精度:
double d = 200.0;
double another = .01;
double exp = 1E3;
以上都是floating point literals。在您的第二个示例中,具体化尤为重要:
var = 50;
double d = var / 250;
我故意省略了var 的类型。目前还不清楚d 将包含什么结果——它可能是0.2 或0.0(如果var 是整数)。另一方面,如果你写double d = var / 250.0,结果总是0.2。
【讨论】:
double var = 200; 这样的语句,编译器足够聪明,可以像double var = 200.0; 这样处理它就是说,你的意思关于整数除法是您应该始终包含“.0”的原因。
200 不是双重的;它是一个整数文字。如果您想精确,请精确到最后:-)
double h = 1 - d; 和 double h = 1.0 - d; 在上下文中阅读时同样精确。那不是重点。关键是一个普通的 Joe 程序员(他一半的心思都在想周末要做什么)是否能够正确理解代码。
根据需要前导和尾随零,单精度常量标记如下:
0.0 为双倍。
0.0f 用于浮点数。
【讨论】:
我不是 Java 人,但 C 和 C++ 也有同样的问题。对我来说,我总是使用“.0”,这样我就不会被不需要的整数除法所困扰。它还消除了关于类型转换的偶尔编译器警告(尽管由于从整数到浮点的明确定义的类型提升语义,这些警告很少见)。
【讨论】:
大多数人在看到具有混合类型的算术表达式时要么会做“双重考虑”,要么会完全误解它。前导零也是如此(在较小程度上);例如在0.1 与.1 中。
良好的风格就是编写代码,使其易于理解,并易于其他人维护。因此,使用正确类型的文字而不是依赖于提升,并且(在较小程度上)使用前导零是一种很好的风格。
【讨论】:
正如其他人所指出的,这只是偏好和可读性的问题。见以下代码和反汇编后的字节码:
public class Twohundred {
public void intVersion() {
double d = 200;
}
public void dblVersion() {
double d = 200.0;
}
}
结果:
public class Twohundred extends java.lang.Object{
public void intVersion();
Code:
0: ldc2_w #2; //double 200.0d
3: dstore_1
4: return
public void dblVersion();
Code:
0: ldc2_w #2; //double 200.0d
3: dstore_1
4: return
}
如您所见,这两种方法几乎完全相同。
【讨论】:
.0 更好
【讨论】: