示例:
float timeRemaining = 0.58f;
为什么在这个数字的末尾需要f
?
你的浮点数声明包含两个部分:
timeRemaining
的类型为 float
。0.58
赋给该变量。问题出现在第二部分。
右侧表达式被单独计算。根据 C# 规范,一个包含小数点但没有后缀的数字会被解释为 double
。
因此,我们现在有一个 double
值,我们想要将其赋给一个类型为 float
的变量。为了做到这一点,必须存在从 double
到 float
的隐式转换。但是,由于在转换过程中可能会丢失信息(在本例中确实如此),因此不存在这样的转换。
原因是编译器使用的值实际上不是 0.58,而是最接近 0.58 的浮点值,对于 double
是 0.57999999999999978655962351581366...,对于 float
则是精确的 0.579999946057796478271484375。
严格来说,f
并不是必需的。您可以通过将值转换为float
来避免使用f
后缀:
float timeRemaining = (float)0.58;
(float) 0.58
会如何工作?你之前说过不进行转换,因为信息可能会丢失,那么为什么强制类型转换会起作用呢? - SexyBeastfloat
、double
和decimal
。除非您允许编译器为您选择一个,否则您必须消除歧义。
double
的文档说明如果您未指定类型,则编译器始终将double
作为任何实数数字文字的类型:f
创建一个float
;后缀d
创建一个double
;后缀m
创建一个decimal
。所有这些后缀均可大写。float timeRemaining = 0.58;
double
的 0.58
转换为 float
的 timeRemaining
可能会丢失信息,因此编译器拒绝隐式应用它。如果您添加显式转换,则会执行转换;如果您添加 f
后缀,则不需要转换。在这两种情况下,代码都将编译。double a = 0.69f;
? - SexyBeast
f
(否则会有编译器错误)。也许这个问题应该被编辑成“为什么编译器会给出这个错误?”——虽然几乎肯定有一个重复的问题。 - Jondouble & int
。 - KV Prajapati