我读到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
5条答案
按热度按时间vd2z7a6w1#
回答你的第一个问题,
它将 5.6 视为 double,而不是整个赋值-c 仍然是 float。
下面是 *Java教程 * 中的一个例外。
Primitive Data Types (The Java™ Tutorials > Learning the Java Language > Language Basics)
至于后续问题
这是部分正确的。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
“*这是因为从一个值到另一个值的推断转换将降低合理的准确性。
本质上,当转换是一个 * 收缩 * 过程时,转换不会被推断。
因此,它抛出一个编译器错误。
nnsrf1az2#
当你说“我读到java默认会让每个float变量都是double”,这是不正确的,你一定是误读了。默认情况下,Java将浮点 * 值 * 设为double。如果你写一个带小数点但不带d的文字值,那么它假定你想要一个d。在你的例子中,5.6是一个默认为double的文本。
然而,类型化变量没有默认值,它是你给予它的任何类型。在你的例子中,c被声明为float,所以它是一个float,意味着单精度浮点。
当你声明一个变量为float类型时,你会得到足够的空间来存储一个单精度浮点数。没有足够的空间来容纳一个双精度浮点数,如果你使用强制转换,你将失去双精度值的额外精度。这就是由发布的代码生成的错误告诉你的,它警告你你会丢失数据。
33qvvth13#
文字
3.1e2
被视为double
,然后将其赋值给float
变量c
,这就是您得到错误的地方。除了将
f
后缀附加到文本之外,还可以显式转换为float
:olqngx594#
它 * 是 * 把它当作
double
。但是,您要将其赋值给float
变量。在某些情况下,C#和Java将允许隐式转换;例如,以下是完全允许的:
由于
double
是比float
“更大”的类型,因此如果您这样做,则不可能丢失数据。但是,如果我尝试执行以下操作:
我最终得到了你得到的同样的编译器错误。同样,这是因为
double
是比float
“更大”的数据类型,因此double
可能包含比float
的最大可能值更大的值。请考虑以下代码示例:它打印
3.4028234663852886E39
。现在,如果我试着把它放在float
中会发生什么?那么,如果我执行以下操作,结果是Infinity
:正如你所看到的,行为是完全不同的。如果一个转换只是发生在“后台”,而您没有意识到它,您可能会得到各种意想不到的结果。
标签:Difference between implicit conversion and explicit conversion
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,因此错误。