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日