在 Java 中,定义浮点变量(例如 this:1
和 this: )之间有什么区别1f
吗?JVM 在我编写时是否在运行时进行任何强制转换1
,或者可能会减慢我的应用程序的速度?
问候
在 Java 中,定义浮点变量(例如 this:1
和 this: )之间有什么区别1f
吗?JVM 在我编写时是否在运行时进行任何强制转换1
,或者可能会减慢我的应用程序的速度?
问候
float a = 1;
float b = 1f;
是一样的,但是如果您执行以下操作:
int a = 1f
将抛出“类型不匹配:无法从 float 转换为 int”
int b = 1d or 1.0
将抛出“类型不匹配:无法从 double 转换为 int”
float c = 1d or 1.0
将抛出“类型不匹配:无法从 double 转换为 float”
注意:
double a = 2.0;
double b = 2d;
double c = 2.0f;
if (a == b) {
if (c == a) {
if (c == b) {
return 1;
}
}
}
将返回 1;
问候。
Java 代码
float f1 = 1;
float f2 = 1f;
编译为以下字节码:
0: fconst_1
1: fstore_1
2: fconst_1
3: fstore_2
如您所见,在运行时没有区别。
基本上1
将默认为int
. 如果你写1f
它会被认为是一个float
. 如果你写1.0
(no f) 它将默认为 a double
。
如果浮点文字以 ASCII 字母 F 或 f 为后缀,则它的类型为 float;否则它的类型是双精度的,并且可以选择以 ASCII 字母 D 或 d 为后缀。
如果是这样的情况,JVM 将通过它。
public class Test {
public static void main(String[] args) {
float f = 1;
System.out.println(f);
}
}
但是,如果您执行以下操作,则会发生异常:
public class Test {
public static void main(String[] args) {
float f = 1.5;
}
}
例外:
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - possible loss of precision
required: float
found: double
at package.Test.main(Test.java:17)
对于这两个例子,我们可以分析的是,第一个例子它会自动转换为,但是对于第二个例子,如果你添加一些不带or后缀float
的小数点,它会自动转换为。f
F
double
1
是的,和之间有很大的不同1f
。因为你不能在java中不给出它的类型就声明一个变量,它的明确1
是一个int
并且在编译时本身1f
表示float
。这与运行时间或减慢您的应用程序无关。