【问题标题】:why f is placed after float values?为什么 f 放在浮点值之后?
【发布时间】:2012-04-02 15:20:24
【问题描述】:

我不知道为什么在Java或其他语言中f或F放在浮点值之后?例如,

float fVariable = 12.3f;

除了表明这是一个浮点值之外的任何特征?

【问题讨论】:

  • 因为否则它们不是浮点值,它们是整数或双精度值。
  • @DeepakRaghuwanshi 将您自己的博客描述为“对此的最佳解释”有点不礼貌。它实际上是一堆垃圾这一事实并没有改善问题。

标签: java floating-point


【解决方案1】:

默认情况下12.3double 字面量,因此告诉编译器将其明确视为float -> 它使用fF

【讨论】:

  • 同样,每个完整的文字默认都是 int。因此,当我们以这种方式分配文字时: long x = 2147483648; (这是 2^31 > int range 但编译器仍然认为这是 int 字面量。所以我们需要通过添加 L 或 l 告诉编译器这是 long ) long x = 2147483648L;
  • 我可能会迟到这篇文章,但是为什么 Java 不能将它隐式转换为浮点数?我们说类型是float,那么为什么我们只是告诉它它是什么,它会把它当作default-double呢。
  • @Stefan 我也有同样的问题。
【解决方案2】:

floatdouble 只能为某些值提供近似表示值。例如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.1double 中最接近的表示,0.1ffloat 中最接近的表示

【讨论】:

  • 太棒了!但哪一个是实际(数学)0.1,哪一个等于 String.valueOf("0.1") ?
  • 只有 BigDecimal 完全相等。如果使用正确,其余的将在转换为字符串时给出正确的答案。
【解决方案3】:

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

浮点数 =13f/5f;

这里 13 和 5 是浮点值。

【讨论】:

  • 浮点 fVariable = 12.3;是不正确的。你总是需要为浮点赋值添加 f 前缀。默认情况下,每个实数都是双倍的。
【解决方案4】:

鉴于在您的程序中表示数字的方式只有这么多,Java 的设计者不得不精心挑选每种形式并将其分配给最常见的用例。对于那些默认选择的表单,表示确切类型的后缀是可选的。

  • 对于整型文字(int、long),默认值为 int。对于明显 原因。
  • 对于浮点文字(float、double),默认值为 double。 因为使用 double 可能允许在 存储值。

所以,当您在程序中键入 12 时,这是一个 int 文字,而不是 12L,这是一个 long。 当您键入 12.3 时,这是一个 double 文字,而不是 12.3F,这是一个 float

那么这在哪里相关?主要用于处理向下转换或缩小转换范围。每当您将 long 转换为 int 或将 double 转换为 float 时,都存在数据丢失的可能性。因此,编译器会强制您指示您真的想要执行缩小转换,通过发出类似这样的编译错误信号:

float f = 12.3;

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

float f = 12.3f;

总结一下,必须为 longsfloats 指定后缀是语言设计者选择的一种折衷方案,以平衡指定具体数字的需要是,具有将数字从一种存储类型转换为另一种存储类型的灵活性。

【讨论】:

  • 值得注意的是,如果d 是某个数字量x 的最佳double 表示,float f=(float)d 将是最接近的float 某个值,该值在万亿分之一以内x,即使它需要类型转换。相比之下,如果f 是某个数值x 的最佳float 表示,则double d=f 不需要类型转换,即使它通常与x 的最佳double 表示相去甚远。 ,并且可能相差数百个数量级。我觉得 float f=(float)(1.0/10.0) 需要演员表,但 double d=1.0f/10.0f 不需要。
  • " 因此,编译器将强制您表明您确实想要执行缩小转换,方法是发出类似这样的编译错误信号:"这是否也适用于 long 虽然
  • @Perception 你为什么写第一点的原因很明显,你能详细说明一下吗?
【解决方案5】:

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

对于十进制值,double数据类型一般是java默认的选择。 Check This

【讨论】:

    【解决方案6】:

    在编译期间,所有浮点数(带小数点的数字)默认为双精度数。

    因此,如果您不希望您的数字翻倍而只是希望它为浮点数,则必须通过添加 fF 来明确告诉编译器字面常量的结尾。

    【讨论】:

      【解决方案7】:

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

      float f = (float) 16.02;

      float f = 16.02f;

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

        • 很高兴有你在stackoverflow。您的回答没问题,但是其他同事已经提供了相同的信息。如果之前没有提到,贡献真的很有价值。欢迎加入..
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-14
        相关资源
        最近更新 更多