如何使用 C# 中的整数和浮点数
本教程介绍 C# 中的数字类型。 你将编写少量的代码,然后编译并运行这些代码。 本教程包含一系列课程,介绍了 C# 中的数字和数学运算。 这些课程介绍了 C# 语言的基础知识。
提示
若要在焦点模式下粘贴代码片段,应使用键盘快捷方式(Ctrl + v 或 cmd + v)。
先决条件
本教程要求安装一台虚拟机,以用于本地开发。 请参阅设置本地环境,了解 .NET 的安装说明和应用程序开发概述。
如果不想设置本地环境,请参阅本教程的交互式浏览器版本。
探索整数数学运算
创建名为 numbers-quickstart 的目录。 将它设为当前目录并运行以下命令:
dotnet new console -n NumbersInCSharp -o .
重要
适用于 .NET 6 的 C# 模板使用顶级语句。 如果你已升级到 .NET 6,则应用程序可能与本文中的代码不匹配。 有关详细信息,请参阅有关新 C# 模板生成顶级语句的文章
.NET 6 SDK 还为使用以下 SDK 的项目添加了一组隐式 指令:
- Microsoft.NET.Sdk
- Microsoft.NET.Sdk.Web
- Microsoft.NET.Sdk.Worker
这些隐式 global using
指令包含项目类型最常见的命名空间。
在常用编辑器中,打开 Program.cs,并将文件内容替换为以下代码:
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
通过在命令窗口中键入 dotnet run
运行此代码。
上面是基本的整数数学运算之一。 int
类型表示整数(零、正整数或负整数)。 使用 +
符号执行加法运算。 其他常见的整数数学运算包括:
-
:减法运算*
:乘法运算/
:除法运算
首先,探索这些不同类型的运算。 在写入 c
值的行之后添加以下行:
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
通过在命令窗口中键入 dotnet run
运行此代码。
如果愿意,还可以通过在同一行中编写多个数学运算来进行试验。 例如,请尝试 c = a + b - 12 * 17;
。 允许混合使用变量和常数。
提示
在探索 C#(或任何编程语言)的过程中,可能会在编写代码时犯错。 编译器 会发现并报告这些错误。 如果输出中包含错误消息,请仔细比对示例代码和你的窗口中的代码,看看哪些需要纠正。 这样做有助于了解 C# 代码结构。
你已完成第一步。 开始进入下一部分前,先将当前代码移到单独的方法中。 方法是组合在一起并赋予名称的一系列语句。 通过在方法名称后面编写 ()
,可以调用一个方法。 将代码组织为方法,可以更轻松地开始使用新示例。 完成后,代码应如下所示:
WorkWithIntegers();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
行 WorkWithIntegers();
调用方法。 下面的代码声明方法并对其进行定义。
探索运算顺序
注释掉对 WorkingWithIntegers()
的调用。 在本节中,它会在你工作时使输出变得不那么杂乱:
//WorkWithIntegers();
//
在 C# 中启动 注释。 注释是你想要保留在源代码中但不能作为代码执行的任何文本。 编译器不会从注释中生成任何可执行代码。 因为 WorkWithIntegers()
是一种方法,所以只需注释掉一行。
C# 语言使用与数学运算规则一致的规则,定义不同数学运算的优先级。 乘法和除法的优先级高于加法和减法。 通过在调用 WorkWithIntegers()
后添加以下代码并执行 dotnet run
来探索:
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
输出结果表明,乘法先于加法执行。
可以在要优先执行的一个或多个运算前后添加括号,从而强制改变运算顺序。 添加以下行并再次运行:
d = (a + b) * c;
Console.WriteLine(d);
通过组合多个不同的运算,进一步探索运算顺序。 添加以下几行内容。 重试 dotnet run
。
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
可能已注意到,整数有一个非常有趣的行为。 整数除法始终生成整数结果,即使预期结果有小数或分数部分也是如此。
如果还没有见过这种行为,请尝试运行以下代码:
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
再次键入 dotnet run
,看看结果如何。
继续之前,让我们获取你在本节编写的所有代码并放在新的方法中。 调用新方法 OrderPrecedence
。 代码应如下所示:
// WorkWithIntegers();
OrderPrecedence();
void WorkWithIntegers()
{
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
// subtraction
c = a - b;
Console.WriteLine(c);
// multiplication
c = a * b;
Console.WriteLine(c);
// division
c = a / b;
Console.WriteLine(c);
}
void OrderPrecedence()
{
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
d = (a + b) * c;
Console.WriteLine(d);
d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
Console.WriteLine(d);
int e = 7;
int f = 4;
int g = 3;
int h = (e + f) / g;
Console.WriteLine(h);
}
探索整数运算精度和限值
在上一个示例中,整数除法截断了结果。 可以使用取模运算符(即 字符)计算余数。 对 OrderPrecedence()
进行方法调用之后,尝试添加以下代码:
int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
int e = (a + b) % c;
Console.WriteLine($"quotient: {d}");
Console.WriteLine($"remainder: {e}");
C# 整数类型不同于数学上的整数的另一点是,int
类型有最小限值和最大限值。 添加以下代码以查看这些限制:
int max = int.MaxValue;
int min = int.MinValue;
Console.WriteLine($"The range of integers is {min} to {max}");
如果运算生成的值超过这些限值,则会出现下溢 或溢出 的情况。 答案似乎是从一个限值覆盖到另一个限值的范围。 添加以下两行以查看示例:
int what = max + 3;
Console.WriteLine($"An example of overflow: {what}");
可以看到,答案非常接近最小(负)整数。 与 min + 2
相同。 加法运算会让整数溢出允许的值。 答案是一个非常大的负数,因为溢出从最大整数值覆盖回最小整数值。
如果 int
类型无法满足需求,还会用到限值和精度不同的其他数字类型。 接下来,让我们来研究一下其他类型。 在开始下一节内容之前,将你在本节编写的代码移到一个单独的方法中。 将其命名为 TestLimits
。
使用双精度类型
double
数字类型表示双精度浮点数。 这些词可能是第一次听说。 浮点 数可用于表示数量级可能非常大或非常小的非整数。 双精度 是一个相对术语,描述用于存储值的二进制数位数。 双精度 数字的二进制数位数是单精度 的两倍。 在新式计算机上,使用双精度数字比使用单精度数字更为常见。 单精度数字是使用 关键字声明的。 接下来,将探索双精度类型。 添加以下代码并查看结果:
double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);
可以看到,答案商包含小数部分。 试试对双精度类型使用更复杂一点的表达式:
double e = 19;
double f = 23;
double g = 8;
double h = (e + f) / g;
Console.WriteLine(h);
双精度值的范围远大于整数值。 在当前已编写的代码下方试运行以下代码:
double max = double.MaxValue;
double min = double.MinValue;
Console.WriteLine($"The range of double is {min} to {max}");
打印的这些值用科学记数法表示。 E
左侧为有效数字。 右侧为是 10 的 n 次幂。 与数学上的十进制数字一样,C# 中的双精度值可能会有四舍五入误差。 试运行以下代码:
double third = 1.0 / 3.0;
Console.WriteLine(third);
你知道 0.3
重复有限次并不完全与 1/3
相同。
挑战
尝试使用 double
类型执行其他的大小数、乘法和除法运算。 尝试执行更复杂的运算。 花了一些时间应对挑战之后,获取已编写的代码并放在一个新方法中。 将新方法命名为 WorkWithDoubles
。
使用十进制类型
大家已学习了 C# 中的基本数字类型,即整数和双精度。 还需要学习另一种类型,即 decimal
类型。 decimal
类型的范围较小,但精度高于 double
。 让我们来实际操作一下:
decimal min = decimal.MinValue;
decimal max = decimal.MaxValue;
Console.WriteLine($"The range of the decimal type is {min} to {max}");
可以看到,范围小于 double
类型。 通过试运行以下代码,可以看到十进制类型的精度更高:
double a = 1.0;
double b = 3.0;
Console.WriteLine(a / b);
decimal c = 1.0M;
decimal d = 3.0M;
Console.WriteLine(c / d);
数字中的 M
后缀指明了常数应如何使用 decimal
类型。 否则,编译器假定为 double
类型。
注意
字母 M
被选为 double
与 decimal
关键字之间最明显不同的字母。
可以看到,使用十进制类型执行数学运算时,十进制小数点右侧的数字更多。
挑战
至此,大家已了解不同的数字类型。请编写代码来计算圆面积(其中,半径为 2.50 厘米)。 请注意,圆面积是用半径的平方乘以 PI 进行计算。 小提示:.NET 包含 PI 常数 Math.PI,可用于相应的值计算。 与 System.Math
命名空间中声明的所有常量一样,Math.PI 也是 double
值。 因此,应使用 double
(而不是 decimal
)值来完成这项挑战。
你应获得 19 和 20 之间的答案。 要查看你的答案,可以查看 GitHub 上的完成示例代码。
如果需要,可以试用一些其他公式。
已完成“C# 中的数字”快速入门教程。 可以在自己的开发环境中继续学习分支和循环快速入门教程。
若要详细了解 C# 中的数字,可以参阅下面的文章: