为什么我们应该在C#中使用字面量?

10

在一些 C# 代码中,我看到了这样的语句:

float someFloat = 57f;

我想知道为什么在上述情况下我们应该使用像f这样的字面量?

7个回答

14

主要是为了让编译器确切地知道我们的意思 - 特别是在重载决策方面:

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)

12

"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

为什么cs不能从类型自动预测呢? - mercury

5

默认情况下,赋值运算符右侧的实数字面量被视为double类型。因此,要初始化一个float变量,请使用后缀f或F,例如:

float x = 3.5F;

如果您不在之前的声明中使用后缀,将会出现编译错误,因为您试图将一个double值存储到float变量中。

来自MSDN: float


1
为什么我们应该使用字面量?
int / int = int 但是 int / float = 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.

1

看看这篇文章,它详细解释了C#中的数字字面量:http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx

以下是文章的一小节:

float unitPrice = 123.45; // 这将无法编译

问题在于你不能总是隐式地将double(123.45)转换为float。C#编译器理解这一点,并停止编译代码。


1
我想知道为什么我们应该在上述情况下使用像f这样的字面量?
其实不用。嗯,你不必要这样做。
上述情况显示了一个浮点数初始化为57f。整数在编译时会隐式转换为浮点数,因此如果您觉得不舒服,可以轻松地去掉f后缀。但是,为了代码书写的一致性,我总是尝试添加后缀。请注意,这仅适用于四舍五入的数字(整数)。
请参阅Msdn关于隐式显式数字转换的说明。

-1

因为57是整数,而57.0是双精度浮点数。你正在尝试获取一个浮点数,它是单精度数字。这引出了一个问题,为什么要使用单精度浮点数?

请参阅http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx 了解更多关于C#字面量的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接