为什么在声明浮点变量时需要在十进制数的末尾放置一个“f”?
我以前看过这个问题。但是,我对给出的答案并不满意。典型的反应是 Java 将数字视为双精度值,因为这是 JAVA 中的默认值,并在编译时给出不匹配错误。
这种行为显然完全忽略了我对浮动声明的使用。
我的问题是:如果我将变量类型声明为float,为什么 Java 认为它是 double 类型?我特别声明:
float x = 3.14;
我已经告诉 Java 我希望通过使用 float 关键字将此变量设为浮点类型。为什么需要这样做?
float x = 3.14f;
如果我想要一个 double 类型的变量,我会使用 double 关键字专门将变量声明为 double。
double x = 3.14;
为什么 Java 在声明变量时不能识别这一点,并坚持需要通过在末尾添加“f”来将文字从双精度型转换为浮点型?Java 不应该识别关键字的使用float并将类型正确分配给文字吗?
回答
大小事项
32 位浮点数 ? float x = 3.14 ;? 64 位双精度
Java中小数数字文字的默认值是 64 位原始double类型,如Mark Rotteveel的回答所示。3.14是 a double,原样3.14d和3.14D。
原始float类型较小,为 32 位。
如果 Java 推断出您所说的是 adouble而您的意思是 a float,则 Java 必须将 64 位值减少为 32 位值,丢弃一半的 32 位数据。这可能涉及较大数量的数据丢失。而这肯定意味着容量的损失。
所以Java的设计者决定在这件事上保守一些。他们决定不要太自以为是地扔掉一半的数据,也不要将指定的容量减少一半。他们决定相信你的话——如果你说 64 位double,他们会给你一个double.
如果您接着说您想将该 64 位数字塞入 32 位容器中,他们会标记错误,因为 64 位不适合 32 位。方钉,圆孔。
圆孔,32 位浮点数?float x = 3.14 ;? 64 位双、方钉
Java 确实支持相反的扩展转换。您可以将 32 位float转换为 64 位double. 并且您可以将 32 位int转换为 64 位long. 这些操作是安全的,因为额外的 32 位可以安全地用零填充。所以Java愿意并且能够支持这些操作。
明确
我建议你养成直言不讳的习惯。不要依赖默认值。如果您的意思是 32 位float,请将f或附加F到您的文字。如果您的意思是 64 位double,请将d或附加D到您的文字。
这样做不仅能让编译器安静下来,还能让阅读你代码的人清楚你的意图。
float pi = 3.14F ;
double pi = 3.14d ;
BigDecimal
而且,顺便说一句,如果您关心准确性而不是性能,您将使用BigDecimal而不是float/ double。在这种情况下,这个问题没有实际意义。
BigDecimal pi = new BigDecimal( "3.14" ) ;