为什么在声明浮点变量时需要在十进制数的末尾放置一个“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.14d3.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" ) ;


以上是为什么在声明浮点变量时需要在十进制数的末尾放置一个“f”?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>