数字字面量末尾的 F 和 D 代表什么?

59

我看到过这些符号,但是我找不到其中有什么奇怪的地方。

double d = 5D;
float f = 3.0F;

5后面的D和F具体是什么意思?


1
对于那些来自 C 语言的人:1)d 后缀在 ANSI C 中不存在,只有 GNU 扩展。2)在 C 语言中不可能使用 1f,必须使用 1.0f。3)对于十六进制整数字面量,df 不起作用,因为它们会与数字本身产生歧义,例如 0x1f31,而不是 1.0f - Ciro Santilli OurBigBook.com
请注意,在使用GCC的C语言中,即使5D作为整数常量也是无效的;5.D则可以。ICC 15会将这样的数字视为0而不发出警告。而在tcc 0.9.27中,会产生编译时错误。 - vinc17
6个回答

60

这意味着这些数字分别为双精度浮点数和单精度浮点数。假设您拥有

void foo(int x);
void foo(float x);
void foo(double x);

然后你调用

foo(5)

编译器可能会被卡住。这就是为什么你可以使用55f5.0来指定类型的原因。


2
使用这个,5.0 == 5d吗? - Ungeheuer
1
@Ungeheuer 是的。如果浮点字面量以字母F或f结尾,则其类型为float;否则其类型为double,并且可以选择以字母D或d结尾。https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html - anishpatel

22

D代表双精度浮点数

F代表单精度浮点数

您可以在此处了解有关Java基本原始类型的信息

http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

我想指出,如果您没有为逗号数字指定类型字符,则默认情况下它是double类型:例如写成5.1D或5.1

如果没有小数点,默认情况下是int类型,例如写成5


6
它们是浮点和双精度字面量的格式说明符。 当您写入1.0时,不清楚您是否打算将文字面量设置为float或double。 通过编写1.0f,您告诉Java您打算使用float文字,而使用1.0d指定它应该是double。 还有L,表示long(例如,1L是一个long 1,而不是一个int 1)

3
澄清一下:这对于javac来说并不含糊,只是对于经验较少的程序员可能存在潜在的歧义。Java语言规范指出,没有后缀的1.0代表一个双精度浮点型数值。 - Ciro Santilli OurBigBook.com

2

D代表双精度浮点数,F代表单精度浮点数。在某些情况下,您需要添加这些修饰符,因为5在此情况下被认为是整数,而3.0是双精度浮点数。


1

正如其他人提到的那样,它们是类型定义,但是你很少会看到i或d被提及,因为它们是默认值。

float myfloat = 0.5; 

由于默认情况下0.5是double类型,您无法将double类型自动转换为float类型(64 -> 32位),因此会出现错误,但是

double mydouble = 0.5;

将没有问题。


1
"autobox" 不是你所描述的正确术语。你的意思是相反的,即降级,但是没有(自动)规则可以实现这一点。 - Tom
我刚刚完成了Oracle Java SE8 Java程序员课程,笔记中有相关内容。在默认情况下,由于精度降低而不会发生自动装箱/拆箱,因此需要类型定义或强制转换来进行精度降低。 - Theresa Forster
自动装箱/拆箱发生在一个原始类型被“转换”为其对应的包装器类型int-> Integer时(或编译器)。你所说的是与提升相反的情况,是的,由于精度丢失,没有自动转换。 - Tom

-2

它定义了常量5和3.0的数据类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接