【问题标题】:What is the difference between 0 and 0. in java?java中的0和0.有什么区别?
【发布时间】:2016-02-19 10:15:44
【问题描述】:

我实际上没有具体的代码,但我和一个朋友的代码完全相同,只是他使用了0.,而我只使用了0。我的编译了,但他没有,直到他删除了点。但是现在,我无意中初始化了一个变量double x = 0.,忘记删除点,它编译了!为什么?

【问题讨论】:

  • 这个小组的主题不是很重要。可能属于 StackExchange。但答案是 0 是一个整数立即数,而 0. 是一个浮点数立即数。
  • 扩展@BrianHibbert 的评论:更准确地说,0. 是double 类型的文字。
  • 并进一步扩展。问题是信息的转换和丢失之一。 double 可以保存任何可以存储在整数中的数字,但反之则不然。编译器通常会自动将整数原语转换为浮点类型,但不会将浮点类型转换为整数以防止潜在的数据丢失。

标签: java types floating-point integer


【解决方案1】:

在这里猜测一下,您/您的朋友可能有一个不允许浮点的数据类型,例如 int 和 long

float 和 double 等数据类型将允许您设置 .

【讨论】:

    【解决方案2】:

    任何带小数点的数字都被视为double 字面量(正式名称为floating-point literal)。在这种情况下,您可以像使用双倍一样使用它。

    因此,指出这一点的语法是,可选部分在括号中划定:

    Digits . [Digits] [ExponentPart] [FloatTypeSuffix]

    就像你无法做到这一点......

    int num = 10.6;
    

    ...你不能这样做...

    int num = 10.;
    

    ...因为那是 double。

    【讨论】:

      【解决方案3】:

      让我们编写一个示例程序。

      class A {
          public static void main(String args[]) {
              int a = 1;
              int b = 2.;
              double c = 3;
              double d = 4.;
          }
      }
      

      其中三个赋值没问题,但一个触发编译错误:

      A.java:4: error: possible loss of precision
              int b = 2.;
                      ^
        required: int
        found:    double
      1 error
      

      那么发生了什么? 1 和 3 是整数常量; 2. 和 4. 是浮点常量。当您尝试在需要浮点值的上下文中使用整数时,整数值会自动转换为浮点数。这是可能的,因为所有整数值都可以用浮点类型表示¹。

      另一方面,int b = 2. 无效,因为通常浮点值不能以整数类型表示。例如,值 2.1 不能表示为 int(或者实际上是任何其他整数类型)。 Java 不会以更改它们的方式自动转换值,因此它拒绝将浮点值分配给整数变量的任何尝试。更一般地说,Java 拒绝在预期整数时使用浮点值的任何尝试。 Java 的规则基于类型,而不是特定值,因此即使 2. 的值可以被解释为适合整数类型²,也不例外。

      您可以使用强制转换强制转换。当浮点值转换为整数类型时,它会向零舍入(即正值向下舍入,负值向上舍入)。

      int b = (int)2.;
      

      ¹ 对于int 和double,所有int 值都可以用double 精确表示。这不适用于整数和浮点类型的其他一些组合:例如,long 类型的一些大值不能用double 类型的值精确表示;但它们可以近似表示,这已经足够了,因为浮点值首先是近似值。
      ² 但实际上该值不适合:2.0 表示“大约 2”(因为所有浮点值都是近似值),而 2 表示“整数 2(精确)”。

      【讨论】:

        【解决方案4】:

        正如@Turing85 所评论的,0 是整数,0.(零点)是双精度数)。 您的朋友很可能正在使用整数变量来存储双精度值。 例如

        int zeroInteger = 0.;
        

        不起作用,因为 (0.) 是一个双精度字面量,它不能分配给整数变量,至少在没有显式类型转换的情况下不能。

        double zeroDouble = 0.;
        

        这应该可以工作,因为变量是双精度类型的。

        任何表示一个值但不存储在变量中的字符序列称为文字。以下是一些有效的 Java 文字:

        1. “你好”
        2. 1234, 0x12, 012, 1234L
        3. 2.3、1E11、2.3D

        由于 Java 支持整数(byte、short、int、long)和浮点数(float、double)的多种数据类型,因此它必须预先决定将哪种类型分配给文字值。

        如果是整数字面量,默认数据类型是integer,如果是浮点数,默认数据类型是double。

        由于浮点字面量的默认数据类型是双精度,如果我们尝试将其分配给浮点变量,Java 会报错。

        float myFloat = 2.3;
        

        这会出错。 正确的做法是将文字类型转换为浮动或只是将 "f" 或 "F" 附加到它。

        float myFloat = 2.3f; // or 2.3F
        

        以上是正确的方法。

        整数文字也是如此。如果我们尝试将整数文字分配给字节或短变量,Java 会产生错误。然而,在这里它通过实际检查分配的值是否超出变量范围来做一些智能的事情,然后只会产生错误。 例如。

        byte someByte = 127;// is ok
        byte someByte = 128; // is not ok
        

        【讨论】:

          猜你喜欢
          • 2016-03-23
          • 2021-06-16
          • 1970-01-01
          • 2012-09-23
          • 2021-02-13
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多