Mag*_*sch 86

float f = 99.32f ;
Run Code Online (Sandbox Code Playgroud)

这是一个float文字,这意味着浮动变量float直接赋值.

float f = (float) 99.32 ;
Run Code Online (Sandbox Code Playgroud)

这是一个 float被分配的变量double被转换为值float被分配之前.

  • 不,`99.32`是一个`double`,不是隐含的.这被称为"double`类型的浮点文字".`99.32f`是一个`float`而不是它.这被称为"float`类型的浮点文字".在`float f = 99.32f;`或`double d = 99.32;`中没有强制转换. (21认同)
  • 不,`99.32`是浮点文字,其类型为'double`. (16认同)
  • 两者之间的价值有什么不同? (7认同)
  • 编译器会优化它吗?(在演员案例中) (5认同)
  • @JanDvorak:很少见,很可能不是这种情况.(float)99.32是实数99.32,四舍五入到最接近的可用双数,四舍五入到最接近的可用浮点数.99.32f是实数99.32,四舍五入到最接近的浮点数.设x是一个恰好位于两个相邻浮点数之间的数字.设d和d'是两个十进制数,只是比x小一点点.然后.f后缀将向上/向下舍入,但是舍入为double可能会在两种情况下都给出结果x,并且转换为float将沿d或d'向错误方向舍入. (5认同)
  • @Magisch:没错.之前你曾建议只是写一个文字涉及一个演员,这是不正确的. (4认同)
  • @EugeneRyabtsev这是真的,但那还不完整.默认情况下,五个字符的"99.32"文字由编译器转换为"double"类型表示; 这是一个转换.然后显式的`(float)`强制转换导致从`double`类型到`float`的另一个转换.最终结果*可能*不同于从6个字符的文字"99.32f"到"浮动"类型表示的一步转换. (3认同)
  • 也许我使用"cast"这个词错了.我的意思是,通过第二种方法,您将十进制值"99.32"指定为double,使其受到双精度的初始舍入.然后当你转换为`float`时,你再次对它进行浮动的初始舍入. (2认同)
  • @ gnasher729一个很好的观察.我想你应该把它变成一个答案.也许当我有时间时,我将尝试找到一个"好"(即源代码文字中没有太多的十进制数字)示例,其中舍入到最近的`double`然后舍入到最近的`float`给出的东西不同于只做一个圆形到"漂浮". (2认同)

sky*_*ing 25

差异可能会被优化掉,但在第一种情况下,你有一个双文字类型,当你在第二种情况下有一个浮点文字时,它被类型化为浮点数.

如果没有优化,您将在第二个示例中的代码中获得类型转换.

然而,有一些极端情况,结果可能(取决于舍入模式)略有不同.如果您的数字无法准确表示,您将在第一种情况下四舍五入 - 首先将十进制表示舍入为double,然后将该四舍五入为浮点数,而在第一种情况下直接舍入十进制表示浮动.

  • 0.50000008940696713产生不同的结果:使用舍入得到"0x1.000004p-1",而使用后缀得到"0x1.000002p-1"(请参阅​​http://ideone.com/EV3QeG).另见https://en.wikipedia.org/wiki/Rounding#Double_rounding (11认同)
  • 更具体地说,11-21的最后两位数都导致"0x1.000003p-1"为double(因此当双舍入为浮点时为"0x1.000004p-1"),最后两位为11-16(大致为该范围的一半)导致"0x1.000002p-1".因此,可以发生这种情况的值的范围(对于每个实例,可能间隔一个浮点ULP分开)大约是一个双ULP宽的一半,并且在每种情况下产生一个浮点ULP的一半的"误差".向上或向下,因为实际值大致在两个浮点值之间. (2认同)

Gop*_*opi 11

在第一种情况下没有强制转换99.32被解释为double而不是float.

双文字正在被浮动.

在第二种情况下,您有一个后缀f,以确保编译器视为99.32float.


cod*_*edd 11

在该行中,默认情况下float f = (float) 99.32;将文字99.32创建为double类型,然后转换为a float.

在该行中float f = 99.32f ;,float由于尾随而将文字创建为类型f,99.32f并且不需要类型转换.

后者类似于写入,double f = 99.32;因为您将double类型直接分配给匹配类型的变量.


101*_*010 10

默认情况下,没有后缀的浮点文字是double类型.

因此,声明float f = (float) 99.32;您首先将显式文字99.32的类型转换double为a float,然后将其分配给变量f.

说明float f = 99.32;做同样的事情,但在这种情况下,类型之间转换是隐式完成的.

如果你想避免隐式转换,你应该使用f后缀来定义你的文字(即float f = 99.32f;)


Evd*_*afa 7

区别在于文字99.32是double类型,而文字99.32f是float类型.

第一个语句将float文本赋给float变量.没什么特别的.

第二个语句将double文字强制转换为float,并将结果赋给float变量.

就标准而言,您可以将double文本分配给float变量,而无需自己显式地转换它.在那种情况下,发生隐式转换.例如:

float f = 99.32;
Run Code Online (Sandbox Code Playgroud)

你甚至可以这样做:

float f = (double) 10.5f;
Run Code Online (Sandbox Code Playgroud)

并且右侧仍然隐式转换为浮动.

请注意,大多数现代编译器都会优化它们,因此表示浮动通常是风格和偏好的问题.只是保持一致.