double表示一个浮点数值类型,它对应.NET基元类型中的System.Double。通常我们把double称为双精度浮点数据。可以存储介于-1.7976931348623157E+308到1.7976931348623157E+308之间的有符号浮点数值。在内存中占8个字节,即64位。
每个浮点类型的默认值都为零。在数字后面带有d或D后缀用来表示double类型。例如:
double v1 = 56.789d;
dobble v2 = 99.99D;
float、double 和decimal都表示浮点数据,只是长度和范围不同。另外它们还可以表示正无穷大、负无穷大和非数字值。在double中分别表示如下:
double.PositiveInfinity | 正无穷大常数 |
double.NegativeInfinity | 负无穷大常数 |
double.NaN | 表示非数字值的常用 |
为什么说上面表中的三种类型为常数?因为在double数据类型中,它们被定义成了const。包括double的最小值和最大值。
public const double MinValue = -1.7976931348623157E+308;
[__DynamicallyInvokable]
public const double MaxValue = 1.7976931348623157E+308;
[__DynamicallyInvokable]
public const double Epsilon = 4.94065645841247E-324;
[__DynamicallyInvokable]
public const double NegativeInfinity = -1.0 / 0.0;
[__DynamicallyInvokable]
public const double PositiveInfinity = 1.0 / 0.0;
[__DynamicallyInvokable]
public const double NaN = 0.0 / 0.0;
观察下面的例子
internal class Program
{
static void Main(string[] args)
{
double max = double.MaxValue;
double min = double.MinValue;
double v = 1.23d;
Console.WriteLine($"max = {max}");//最大输出值
Console.WriteLine($"min = {min}");//最小输出值
Console.WriteLine($"v = {v}");//输出值
Console.WriteLine($"v的类型为{v.GetType()}");//变量类型
Console.WriteLine($"double占内存大小为{sizeof(double)}");//内存大小
Console.WriteLine($"double.NegativeInfinity ={double.NegativeInfinity}");
Console.WriteLine($"double.PositiveInfinity ={double.PositiveInfinity}");
Console.WriteLine($"double.NaN ={double.NaN}");
double result = 10 / 3f;
Console.WriteLine($"result = {result}");//输出值
Console.ReadKey();
}
}
输出结果
max = 1.79769313486232E+308
min = -1.79769313486232E+308
v = 1.23
v的类型为System.Double
double占内存大小为8
double.NegativeInfinity =-∞
double.PositiveInfinity =∞
double.NaN =NaN
result = 3.33333325386047
结果分析
double的小数位数最多为14位。另外,NaN这个常量有些特殊,比如,NaN并不等于NaN本身,同时既不大于本身,也不小于本身。NaN.CompareTo(NaN)的结果为0。
考虑下面的代码输出
double dd = 10000000000000000000000d;
dd += 1;
Console.WriteLine("{0:G50}", dd);
结果:10000000000000000000000
咦?不是加了一个1吗?跑哪儿去了?这是因为浮点数精度损失的问题,像类似的例子还有很多,比如d * g / g 不一定等于d,d / g * g也不一定等于d。 那么如要需要用到高精度的数据类型,又该怎么办呢?decimal可以解决这个问题。下一节我们来探讨一下它。
——重庆教主 2024年1月19日