在一些 C# 代码中,我看到了这样的语句:
float someFloat = 57f;
我想知道为什么在上述情况下我们应该使用像f
这样的字面量?
在一些 C# 代码中,我看到了这样的语句:
float someFloat = 57f;
我想知道为什么在上述情况下我们应该使用像f
这样的字面量?
主要是为了让编译器确切地知道我们的意思 - 特别是在重载决策方面:
Foo(57f);
应该调用 Foo(int)
/ Foo(float)
/ Foo(decimal)
吗?
实际上,我不喜欢记忆 - 另外一种选择是:
float someFloat = (float)57;
这不是运行时强制转换 - 它与 57f
在 IL 级别上是相同的。唯一微妙的不同之处是在具有额外精度的 decimal
类型中:
decimal someDecimal = (decimal)57.0; // same as 57M, not 57.0M (scale is different)
"f"是一种类型后缀。它告诉编译器提供的字面量的确切类型。这样做是为了让编译器为字面量分配适当数量的存储空间(精度)。默认情况下,浮点数文字被分配“double”的存储空间。如果您将“f”添加为后缀,则该字面值仅获得float的存储空间,这将具有较低的精度。
double d = 50.1234; // given double storage
double d = 50.1234f; // given float storage, which might lose precision compared to double
默认情况下,赋值运算符右侧的实数字面量被视为double类型。因此,要初始化一个float变量,请使用后缀f或F,例如:
float x = 3.5F;
如果您不在之前的声明中使用后缀,将会出现编译错误,因为您试图将一个double值存储到float变量中。
int timespanInMS = 500;
Console.WriteLine("Execution time: {0} sec.", timespanInMS / 1000);
Console.WriteLine("Execution time: {0} sec.", timespanInMS / 1000F);
// Result:
// Execution time: 0 sec.
// Execution time: 0.5 sec.
看看这篇文章,它详细解释了C#中的数字字面量:http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx
以下是文章的一小节:
float unitPrice = 123.45; // 这将无法编译
问题在于你不能总是隐式地将double(123.45)转换为float。C#编译器理解这一点,并停止编译代码。
因为57是整数,而57.0是双精度浮点数。你正在尝试获取一个浮点数,它是单精度数字。这引出了一个问题,为什么要使用单精度浮点数?
请参阅http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx 了解更多关于C#字面量的信息。