为什么要在 C# 中使用文字?

问题描述 投票:0回答:7

在一些C#代码中,我见过这样的语句:

float someFloat = 57f;

为什么我们应该在上面的例子中使用像

f
这样的文字?

c#
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”是类型后缀。 这告诉编译器所提供的文字的确切类型。 使用它是为了让编译器可以为文字分配适当的存储量(精度)。 默认情况下,浮点文字被指定为“双精度”存储。 如果添加“f”作为后缀,则文字将只能获取浮点数的存储,这会降低准确性。

double d = 50.1234; // given double storage
double d = 50.1234f; // given float storage, which might lose precision compared to double

5
投票

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

float x = 3.5F;

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

来自MSDN:浮动


1
投票

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

以下是文章的一小段摘录:

浮动单位价格 = 123.45; // 这 不会编译

这里的问题是你不能 总是隐式转换 double (123.45) 变成浮点数。 C# 编译器 理解这一点并停止代码 正在编译


1
投票

我想知道为什么我们应该使用 在上面的例子中,像 f 这样的文字?.

你不应该。好吧,你没有

上述情况显示浮点初始化为 57f。整数在编译时会隐式转换为浮点数,因此如果您感到困扰,您可以轻松地去掉 f 后缀。然而,为了书面代码的一致性,我总是尝试添加后缀。请注意,这仅适用于四舍五入的数字(整数)。

请参阅有关隐式显式号码对话的Msdn。


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
投票

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

有关 C# 文字的更多信息,请参阅 http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx

© www.soinside.com 2019 - 2024. All rights reserved.