练习 - 发现浮点类型
- 8 分钟
在本练习中,你将使用浮点数据类型来了解每种数据类型之间的细微差别。
浮点是一种简单值类型,表示小数点右侧的数字。 与整数不同,除了可以存储在给定浮点类型中的最大值和最小值之外,还有其他注意事项。
评估浮点类型
首先,必须考虑每种类型允许的精度位数。 精度是小数点之后存储的值位数。
其次,必须考虑存储值的方式,以及值的准确性的影响。 例如, float 值 double 以二进制(base 2)格式在内部存储,而 decimal 以十进制(base 10)格式存储。 为什么这很重要?
对二进制浮点值执行数学运算可能会产生结果,如果你习惯于十进制(基 10)数学,可能会让你大吃一惊。 通常,二进制浮点数学是实际值的近似值。 因此,并且double非常有用,float因为可以使用较小的内存占用来存储大量数据。 但是, floatdouble 仅当近似值很有用时,才应使用。 例如,在计算视频游戏中雪球的飞溅时,几千分之一点就足够近了。
需要更精确的答案时,应使用 decimal。 每种类型的 decimal 值占用的内存占用量相对较大,但执行数学运算可提供更精确的结果。 因此,在处理财务数据或需要计算准确结果的任何方案时,应使用 decimal 此方法。
对每个有符号浮点类型使用 MinValue 和 MaxValue 属性
删除或使用行注释运算符
//注释掉前面步骤中的所有代码。若要查看各种数据类型的值范围,请在 Visual Studio Code 编辑器中更新代码,如下所示:
Console.WriteLine("");
Console.WriteLine("Floating point types:");
Console.WriteLine($"float : {float.MinValue} to {float.MaxValue} (with ~6-9 digits of precision)");
Console.WriteLine($"double : {double.MinValue} to {double.MaxValue} (with ~15-17 digits of precision)");
Console.WriteLine($"decimal: {decimal.MinValue} to {decimal.MaxValue} (with 28-29 digits of precision)");
在 Visual Studio Code 的“文件”菜单上,选择“保存”。
在生成或运行代码之前,必须保存 Program.cs 文件。
在“EXPLORER”面板中,若要在 TestProject 文件夹位置打开终端,请右键单击“TestProject”,然后选择“在集成终端中打开”。
终端面板应该打开,并应包含一个命令提示符,表明终端已在您的 TestProject 文件夹位置打开。
在终端命令提示符处,若要运行代码,请键入 dotnet run,然后按 Enter。
如果看到一条消息“找不到要运行的项目”,请确保终端命令提示符显示预期的 TestProject 文件夹位置。 例如:
C:\Users\someuser\Desktop\csharpprojects\TestProject>应会看到以下输出:
Floating point types: float : -3.402823E+38 to 3.402823E+38 (with ~6-9 digits of precision) double : -1.79769313486232E+308 to 1.79769313486232E+308 (with ~15-17 digits of precision) decimal: -79228162514264337593543950335 to 79228162514264337593543950335 (with 28-29 digits of precision)
如你所看到的, float 并使用 double 不同的表示法 decimal 来表示其最大和最小可能的值。 但这一表示法意味着什么?
解码大型浮点值
由于浮点类型可以使用精度保存大量数字,因此可以使用“E 表示法”来表示其值,这是一种科学表示法形式,这意味着“10 次提升到幂”。因此,值类似于 5E+2 值 500,因为它相当于 5 * 10^2 或 5 x 102。
回顾
- 浮点类型是一种简单值数据类型,可以保存小数。
- 为应用程序选择正确的浮点类型需要你考虑的不仅仅是可以保留的最大值和最小值。 还必须考虑小数后可以保留多少个值、数字的存储方式以及其内部存储如何影响数学运算的结果。
- 当数字增长特别大时,有时可以使用“E 表示法”来表示浮点值。
- 编译器和运行时的处理
decimal方式(尤其是floatdouble确定数学运算所需的准确度)有根本区别。