Tho*_*mas 79 c# floating-point
例:
float timeRemaining = 0.58f;
Run Code Online (Sandbox Code Playgroud)
为什么f在号码末尾需要?
Jef*_*Sax 87
您的浮动声明包含两部分:
timeRemaining是类型的float.0.58此变量.问题出现在第2部分.
右侧是自己评估的.根据C#规范,包含没有后缀的小数点的数字被解释为a double.
所以我们现在有一个double我们想要分配给类型变量的值float.为了做到这一点,必须有从隐式转换double到float.没有这样的转换,因为您可能(并且在这种情况下)在转换中丢失信息.
原因是编译器使用的值实际上不是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)
Jon*_*Jon 36
因为有几个数字类型,编译器可以用它来表示该值0.58:float,double和decimal.除非你对编译器选择一个你没问题,否则你必须消除歧义.
double状态的文档,如果你自己没有指定类型,编译器总是选择double任何真正的数字文字的类型:
默认情况下,赋值运算符右侧的实数数字文字被视为double.但是,如果要将整数视为double,请使用后缀d或D.
附加后缀f会创建一个float; 后缀d创建了一个double; 后缀m创建了一个decimal.所有这些也都是大写的.
但是,这仍然不足以解释为什么这不编译:
float timeRemaining = 0.58;
Run Code Online (Sandbox Code Playgroud)
缺失的一半答案是从转换double 0.58到float timeRemaining潜在的丢失信息,因此编译器拒绝隐式应用它.如果添加显式强制转换,则执行转换; 如果添加f后缀,则不需要转换.在这两种情况下,代码都会编译.