【问题标题】:Proper notation using doubles使用双打的正确符号
【发布时间】: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


    【解决方案1】:

    这与风格本身无关。当你写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.20.0(如果var 是整数)。另一方面,如果你写double d = var / 250.0,结果总是0.2

    【讨论】:

    • 我不确定,但我会猜测使用像double var = 200; 这样的语句,编译器足够聪明,可以像double var = 200.0; 这样处理它就是说,你的意思关于整数除法是您应该始终包含“.0”的原因。
    • 我使用 IntelliJ,当您尝试使用 double var = 200; 时它会警告您。我认为以正确的类型声明文字总是一个好主意。
    • @ChssPly76。 JLS 完全清楚这些表达式的含义。不确定性存在于阅读代码的人的脑海中,一个好的程序员会使用一种将不确定性最小化的风格。这绝对是一个风格问题——选择一种能最大限度地减少人们误解代码功能的风格。
    • @Stephen - 确实,JLS 明确表示 200 不是双重的;它是一个整数文字。如果您想精确,请精确到最后:-)
    • @ChssPly76 - 我不明白你的最后一句话。例如,在原始问题中,double h = 1 - d;double h = 1.0 - d; 在上下文中阅读时同样精确。那不是重点。关键是一个普通的 Joe 程序员(他一半的心思都在想周末要做什么)是否能够正确理解代码。
    【解决方案2】:

    根据需要前导尾随零,单精度常量标记如下:

    0.0 为双倍。

    0.0f 用于浮点数。

    【讨论】:

    • 这不是真的,像“.1”和“.1f”这样的常量在C/C++/Java中是完全有效的
    • @Kip:我们在这里谈论的是偏好,而不是严格要求。
    【解决方案3】:

    我不是 Java 人,但 C 和 C++ 也有同样的问题。对我来说,我总是使用“.0”,这样我就不会被不需要的整数除法所困扰。它还消除了关于类型转换的偶尔编译器警告(尽管由于从整数到浮点的明确定义的类型提升语义,这些警告很少见)。

    【讨论】:

      【解决方案4】:

      大多数人在看到具有混合类型的算术表达式时要么会做“双重考虑”,要么会完全误解它。前导零也是如此(在较小程度上);例如在0.1.1 中。

      良好的风格就是编写代码,使其易于理解,并易于其他人维护。因此,使用正确类型的文字而不是依赖于提升,并且(在较小程度上)使用前导零是一种很好的风格。

      【讨论】:

        【解决方案5】:

        正如其他人所指出的,这只是偏好和可读性的问题。见以下代码和反汇编后的字节码:

        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
        
        }
        

        如您所见,这两种方法几乎完全相同。

        【讨论】:

          【解决方案6】:

          .0 更好

          【讨论】:

            猜你喜欢
            • 2011-01-26
            • 1970-01-01
            • 2013-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多