处理整数和浮点数
本教程使用浏览器以交互方式介绍了 C# 中的数字类型。 你将编写 C# 代码,并查看代码编译和运行结果。 具体包含一系列课程,探索了 C# 中的数字和数学运算。 这些课程介绍了 C# 语言的基础知识。
提示
若要在焦点模式下粘贴代码片段,应使用键盘快捷方式(Ctrl + v 或 cmd + v)。
探索整数数学运算
在交互式窗口中,运行以下代码。 选择“进入焦点模式”按钮。 然后,在交互式窗口中键入以下代码块,并选择“运行”:
int a = 18;
int b = 6;
int c = a + b;
Console.WriteLine(c);
若要处理环境,应改为按照本地版本的说明操作。
上面是基本的整数数学运算之一。 int
类型表示整数(正整数或负整数)。 使用 +
符号执行加法运算。 其他常见的整数数学运算包括:
-
:减法运算*
:乘法运算/
:除法运算
提示
在本交互式教程中,可以修改在交互式窗口中已编写的代码,自行进行探索。 本教程提供了可分步试运行的示例。
首先,探索这些不同类型的运算。 修改第三行代码,尝试执行所有这些运算。 每次编辑后,选择“运行”按钮。
减法:
int c = a - b;
乘法:
int c = a * b;
除法:
int c = a / b;
如果愿意,还可以通过在同一行中编写多个数学运算来进行试验。
提示
在探索 C#(或任何编程语言)的过程中,可能会在编写代码时犯错。 编译器会发现并报告这些错误。 如果输出中有错误消息,请仔细比对示例代码和交互式窗口中的代码,看看要纠正哪些代码。 这样做有助于了解 C# 代码结构。
探索运算顺序
C# 语言使用与数学运算规则一致的规则,定义不同数学运算的优先级。 乘法和除法的优先级高于加法和减法。 在交互式窗口中,运行以下代码进行探索:
int a = 5;
int b = 4;
int c = 2;
int d = a + b * c;
Console.WriteLine(d);
输出结果表明,乘法先于加法执行。
可以在要优先执行的一个或多个运算前后添加括号,从而强制改变运算顺序:
int a = 5;
int b = 4;
int c = 2;
int d = (a + b) * c;
Console.WriteLine(d);
通过组合多个不同的运算,进一步探索运算顺序。 将上面的第四行代码替换为以下代码:
int d = (a + b) - 6 * c + (12 * 4) / 3 + 12;
可能已注意到,整数有一个非常有趣的行为。 整数除法始终生成整数结果,即使预期结果有小数或分数部分也是如此。
如果还没有见过这种行为,请尝试运行以下代码:
int a = 7;
int b = 4;
int c = 3;
int d = (a + b) / c;
Console.WriteLine(d);
再次选择“运行”,看看结果如何。
探索整数运算精度和限值
在上一个示例中,整数除法截断了结果。
可以使用余数运算符(即 %
字符)计算余数:
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
类型无法满足需求,还会用到限值和精度不同的其他数字类型。 接下来,让我们来研究一下这些数字类型。
使用双精度类型
double
数字类型表示双精度浮点数。 这些词可能是第一次听说。 浮点数可用于表示数量级可能非常大或非常小的非整数。 双精度是一个相对术语,描述用于存储值的二进制数位数。 双精度 数字的二进制数位数是单精度 的两倍。 在新式计算机上,使用双精度数字比使用单精度数字更为常见。 单精度数字是使用 float
关键字声明的。
接下来,将探索双精度类型。 在交互式窗口中,试运行以下代码,看看结果如何:
double a = 5;
double b = 4;
double c = 2;
double d = (a + b) / c;
Console.WriteLine(d);
可以看到,答案商包含小数部分。 试试对双精度类型使用更复杂一点的表达式:
double a = 19;
double b = 23;
double c = 8;
double d = (a + b) / c;
Console.WriteLine(d);
双精度值的范围远大于整数值。 在交互式窗口中,试运行以下代码:
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
等于 3/10
,且与 1/3
并不完全相等。 同样,0.33
等于 33/100
。 虽然更接近 1/3
,但仍不完全相等。
挑战
尝试使用 double
类型执行其他的大小数、乘法和除法运算。 尝试执行更复杂的运算。
使用十进制类型
大家已学习了 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 之间的答案。
完成挑战
最后是否生成如下代码?
double radius = 2.50;
double area = Math.PI * radius * radius;
Console.WriteLine(area);
如果需要,可以试用一些其他公式。
恭喜!
你已完成“C# 中的数字”交互式教程。 可选择下方的“分支和循环”链接开始下一个交互式教程,或者可访问 .NET 站点下载 .NET SDK,在计算机上创建项目,并继续编码。 请通过“后续步骤”部分返回到这些教程。
若要详细了解 C# 中的数字,可以参阅下面的文章:
你有关于此部分的问题? 如果有,请向我们提供反馈,以便我们对此部分作出改进。