为什么在宣布花车时需要"f"?

Tho*_*mas 79 c# floating-point

例:

float timeRemaining = 0.58f;
Run Code Online (Sandbox Code Playgroud)

为什么f在号码末尾需要?

Jef*_*Sax 87

您的浮动声明包含两部分:

  1. 它声明变量timeRemaining是类型的float.
  2. 它将值赋给0.58此变量.

问题出现在第2部分.

右侧是自己评估的.根据C#规范,包含没有后缀的小数点的数字被解释为a double.

所以我们现在有一个double我们想要分配给类型变量的值float.为了做到这一点,必须有从隐式转换doublefloat.没有这样的转换,因为您可能(并且在这种情况下)在转换中丢失信息.

原因是编译器使用的值实际上不是0.58,而是最接近0.58的浮点值,即0.57999999999999978655962351581366 ... for double和0.579999946057796478271484375 for float.

严格来说,这f不是必需的.您可以f通过将值转换为float以下内容来避免使用后缀:

float timeRemaining = (float)0.58;
Run Code Online (Sandbox Code Playgroud)

  • 1.我使用Windows计算器,最多使用34位数字.我说没有*隐含*转换.强制转换是一种显式转换,因此您明确告诉编译器您希望进行转换,这是允许的. (7认同)
  • 两个问题,你是怎么得到数字'0.579999946057796478271484375'的,`(浮点数)0.58怎么样?你之前说的是没有转换,因为信息可能会丢失,那么演员怎么会起作用呢? (4认同)

Jon*_*Jon 36

因为有几个数字类型,编译器可以用它来表示该值0.58:float,doubledecimal.除非你对编译器选择一个你没问题,否则你必须消除歧义.

double状态的文档,如果你自己没有指定类型,编译器总是选择double任何真正的数字文字的类型:

默认情况下,赋值运算符右侧的实数数字文字被视为double.但是,如果要将整数视为double,请使用后缀d或D.

附加后缀f会创建一个float; 后缀d创建了一个double; 后缀m创建了一个decimal.所有这些也都是大写的.

但是,这仍然不足以解释为什么这不编译:

float timeRemaining = 0.58;
Run Code Online (Sandbox Code Playgroud)

缺失的一半答案是从转换double 0.58float timeRemaining潜在的丢失信息,因此编译器拒绝隐式应用它.如果添加显式强制转换,则执行转换; 如果添加f后缀,则不需要转换.在这两种情况下,代码都会编译.

  • @BlazArt是的,这句话指出编译器甚至没有尝试检查赋值目标。其原因将隐藏在编译器团队所做的设计选择中。我认为面对可能的混乱,最好是明确的,否则实施起来就太昂贵了,而不是只有两个规则,一个用于“int”,一个用于“double”。 (2认同)
  • 关于信息丢失,您能告诉我转换实际上是如何完成的,就它们存储的 IEEE 754 格式而言?Double 具有更高的精度,所以这是否意味着从 float 到 double 的转换将始终有效,例如 `double a = 0.69f;`? (2认同)