为什么将f放在浮点值后面?


78

我不知道为什么在Java或其他语言的float值后面放置f或F?例如,

float fVariable = 12.3f;

除了表明这是一个浮点值以外,还有其他功能吗?



因为否则它们不是浮点值,因此它们是整数或双精度数。
罗恩侯爵,

@DeepakRaghuwanshi将自己的博客描述为“有史以来最好的解释”有点不客气。实际上它是垃圾的事实并不能改善问题。
罗恩侯爵,

Answers:


66

默认情况下12.3double文字,因此要告诉编译器将其float显式对待->它使用fF


2
同样,每个默认整数都是默认int。因此,当我们以这种方式分配文字时:long x = 2147483648; (这是2 ^ 31> int range,但是编译器仍将其视为int常量。因此,我们需要通过加L或l来告诉编译器这很长)long x = 2147483648L;
Navdeep Singh,

我可能迟到了这篇文章,但是Java为什么不能将其转换为隐式浮动呢?我们说类型是浮点型的,那么当我们告诉它是什么类型时,为什么将它视为default-double呢?
斯特凡

50

看到程序中表示数字的方式太多了,Java的设计人员不得不挑选每种形式并将其分配给最常见的用例。对于默认选择的那些表格,表示确切类型的后缀是可选的。

  • 对于Integer文字(int,long),默认值为int。出于明显的原因。
  • 对于浮点文字(float,double),默认值为double。因为使用double可能允许对存储的值进行更安全的算术运算。

因此,当您键入12程序时,多数民众赞成在一个int文字,而不是12L,这是一个long。当您键入时12.3,多数民众赞成在一个精度字面量,而不是12.3F,这是一个float

那么这在哪里呢?主要用于处理垂头丧气或缩小转换范围。每当将long转换为int或将double转换为float时,都存在数据丢失的可能性。因此,编译器将通过发出类似以下内容的编译错误来迫使您指示您确实要执行缩小转换:

float f = 12.3;

由于12.3代表双精度型,因此您必须将其显式转换为浮点型(基本上在缩小转换上签字)。否则,可以通过使用正确的后缀来表明该数字实际上是一个浮点数。

float f = 12.3f;

因此,总而言之,必须为长整型浮点型指定一个后缀是语言设计人员选择的一种折衷方案,以便平衡指定确切数字的需求以及将数字从一种存储类型转换为另一种存储类型的灵活性。


1
值得注意的是,即使ddouble某种数值形式的最佳表示形式xfloat f=(float)d也将最接近float于每万亿分之一内的某个值x,即使它需要进行类型转换。相反,如果ffloat某个数值的最佳表示形式xdouble d=f则即使它通常与最佳double表示形式相差甚远x,并且可能相差数百个数量级,也不需要进行类型转换。我觉得具有讽刺意味的是float f=(float)(1.0/10.0)需要演员,但double d=1.0f/10.0f不是。
超级猫

“因此,编译器将通过发出类似以下内容的编译错误来迫使您指示您确实要执行缩小转换:”这种情况也应长期适用
RetroCode

@Perception为什么写?出于显而易见的原因,请首先详细说明一下?
Rishabh Agrawal

27

float并且double只能提供某些值的近似表示值。例如12.3或0.1

区别在于浮点数不那么精确(因为浮点数较小,因此精度较低)

例如

System.out.println("0.1f == 0.1 is " + (0.1f == 0.1));
System.out.println("0.1f is actually " + new BigDecimal(0.1f));
System.out.println("0.1 is actually " + new BigDecimal(0.1));

版画

0.1f == 0.1 is false
0.1f is actually 0.100000001490116119384765625
0.1 is actually 0.1000000000000000055511151231257827021181583404541015625

因此,0.1在最近的表现double,并0.1f在最近的表现float


大!但是,哪一个是实际的(数学上的)0.1,而哪一个等于String.valueOf(“ 0.1”)?
Seshu Vinay 2014年

4
只有BigDecimal完全相等。如果正确使用,其余的转换为字符串时将给出正确的答案。
彼得·劳里

5

float fVariable = 12.3; 很好 但是,当您在任何表达式中仅使用浮点值(不带任何标识符)时,您需要告诉编译器该值是浮点的,因此在值之后使用后缀“ f”。例

浮动fl = 13f / 5f;

这里13和5是浮点值。


float fVariable = 12.3; 是不正确的。您始终需要为浮动分配添加f前缀。默认情况下,每个实数都是两倍。
Navdeep Singh,

1

在编译期间,所有浮点数(带小数点的数字)默认都加倍。

因此,如果您不想让数字加倍,而只希望其为浮点数,则必须通过在文字常量的末尾添加fF来明确告知编译器。


1

在Java中,我们有许多不同的基本变量类型,因此为了使其通用,它具有一些默认功能。就像我们输入16.02一样,它会自动将其作为双输入。因此,如果您想将其指定为浮点数,我们在数字后面提及“ f”,或者我们可以简单地使用:

float f = (float) 16.02;

要么

float f = 16.02f;

同样,如果我们希望将数字保存为长类型,则必须提到16 l,否则它将自动选择默认类型,即int类型。


0

浮点数是单精度的32位IEEE 754浮点,而Double是双精度的64位IEEE 754浮点。当您使用带小数点的值并且如果您不指定它为0.23f(特别是浮点数)时,java会将其标识为双精度型。

对于十进制值,双精度数据类型通常是java的默认选择。 检查这个


0

如果不使用f,它将被解释为double,这是Java中的默认值。您也可以这样写##

float f=(float) 32.5956; float f=32.5956f;


最好让您参与stackoverflow。您的答案还可以,但是其他同事已经提供了相同的信息。如果以前没有提到过,那么贡献就很有价值。欢迎船上..
Hasnaa Ibraheem
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.