java 将双精度型赋值给浮点型变量

qyuhtwio  于 2023-06-20  发布在  Java
关注(0)|答案(5)|浏览(196)

我读到java对待float c = 5.6;默认情况下,除非指定f后缀,否则为double。

public class Main {
  public static void main(String[] args) {
    float c = 3.1e2;
    System.out.println(c);

  }
}

在这段代码中,3.1e2是一个double类型,而c也应该是一个double类型,因为我读到java默认会让每个float变量都是一个double类型,除非你指定了f后缀。但是我得到一个错误,说Main.java:3: error: incompatible types: possible lossy conversion from double to float float c = 3.1e2; ^ 1 error

vd2z7a6w

vd2z7a6w1#

回答你的第一个问题,

  • “我读到java对待float c = 5.6;默认情况下为double,除非指定f后缀。"*

它将 5.6 视为 double,而不是整个赋值-c 仍然是 float
下面是 *Java教程 * 中的一个例外。
Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)

  • "浮点文字*
  • 浮点文字的类型是float,如果它以字母F或f结尾;否则,它的类型是double,并且可以选择以字母D或d结尾。

至于后续问题

  • "...在这段代码中,3.1e2是一个double,c默认也应该是一个double,因为我读到java默认会让每个float变量都是一个double,除非你指定了f后缀。

这是部分正确的。c 变量不会隐式转换为 double
它将是任何声明类型-在本例中是 float
浮点类型(float和double)也可以使用E或e(用于科学记数法),F或f(32位浮点字面值)和D或d(64位双精度字面值;这是默认值,按照惯例将省略)。"*
最后

  • 但我得到了一个错误 *
  • Main.java:3: error: incompatible types: possible lossy conversion from double to float“*

这是因为从一个值到另一个值的推断转换将降低合理的准确性。

  • Java语言规范 * 将此操作定义为 *“缩小原语转换 *”。
  • Java语言规范-第5章。转换和晋升 *。
  • “缩小基元转换可能会丢失有关数值的整体大小的信息,也可能会丢失精度和范围。"*

本质上,当转换是一个 * 收缩 * 过程时,转换不会被推断。
因此,它抛出一个编译器错误。

nnsrf1az

nnsrf1az2#

当你说“我读到java默认会让每个float变量都是double”,这是不正确的,你一定是误读了。默认情况下,Java将浮点 * 值 * 设为double。如果你写一个带小数点但不带d的文字值,那么它假定你想要一个d。在你的例子中,5.6是一个默认为double的文本。
然而,类型化变量没有默认值,它是你给予它的任何类型。在你的例子中,c被声明为float,所以它是一个float,意味着单精度浮点。
当你声明一个变量为float类型时,你会得到足够的空间来存储一个单精度浮点数。没有足够的空间来容纳一个双精度浮点数,如果你使用强制转换,你将失去双精度值的额外精度。这就是由发布的代码生成的错误告诉你的,它警告你你会丢失数据。

33qvvth1

33qvvth13#

文字3.1e2被视为double,然后将其赋值给float变量c,这就是您得到错误的地方。
除了将f后缀附加到文本之外,还可以显式转换为float

float c = (float)3.1e2;
olqngx59

olqngx594#

它 * 是 * 把它当作double。但是,您要将其赋值给float变量。
在某些情况下,C#和Java将允许隐式转换;例如,以下是完全允许的:

class Main {
    public static void main(String[] args) {
        float c = 3.1e2f;
        System.out.println(c);
        
        double d = c;
        
        System.out.println(d);
    }
}

由于double是比float“更大”的类型,因此如果您这样做,则不可能丢失数据。
但是,如果我尝试执行以下操作:

public class Main
{
    public static void main(String[] args) {
        double c = 3.1e2;
        System.out.println(c);
        
        float d = c;
        
        System.out.println(d);
    }
}

我最终得到了你得到的同样的编译器错误。同样,这是因为double是比float“更大”的数据类型,因此double可能包含比float的最大可能值更大的值。请考虑以下代码示例:

public class Main
{
    public static void main(String[] args) {
        double c = 10*(double)Float.MAX_VALUE;
        System.out.println(c);
    }
}

它打印3.4028234663852886E39。现在,如果我试着把它放在float中会发生什么?那么,如果我执行以下操作,结果是Infinity

public class Main
{
    public static void main(String[] args) {
        float c = 10*Float.MAX_VALUE;
        System.out.println(c);
    }
}

正如你所看到的,行为是完全不同的。如果一个转换只是发生在“后台”,而您没有意识到它,您可能会得到各种意想不到的结果。
标签:Difference between implicit conversion and explicit conversion

pobjuy32

pobjuy325#

如果你只是想要一个简单的答案,没有任何解释或任何东西,那么你的代码将如下所示。。
return 3.1e2f;
System.out.println(c);
你说的有一部分是不正确的,因为在你的陈述中,“我读到java对待float c = 5.6;默认情况下,除非你指定了f后缀,否则它是一个double。”,Java实际上并没有把c也当作double; c将是一个浮点变量,但由于一个double值'5.6'被分配给一个float,而float大于double,因此错误。

相关问题