在.net中,系统标准的double(双精度浮点型)数据类型是以一个结构体的形式存在(结构体与类的区别在于结构体在实例化时候会初始化所有成员变量,未赋值的引用类型成员会自动调用无参构造函数进行初始化,而类在实例化时候不会初始化所有成员变量,未赋值的引用类型成员值为null)
定义一个double类型的数据可以是
using System;
class myTest
{
public static double a = 1;
public static System.Double b = 1;
}
其中,double是一个关键字,是对System.Double结构类型名称的简写形式
从Double的结构体中可以看出
Double的取值范围为
-1.7976931348623157E+308 ~ 1.7976931348623157E+308
可以通过结构体常量 double.MinValue double.MaxValue直接获得
Double的最小精度为
public const Double Epsilon = 4.94065645841247E-324
也就是说double类型数据并不是在实数区间上式连续的,而是在一个有限区间内,每间隔一个最小精度取一个值,相邻两个取值之前相差一个Epsilon的长度
如果一个计算的实际值介于double的两个相邻取值之间,则这个值会向靠近0的方向截断
正无穷可以通过两个Double类型的1/0获取
负无穷等于正无穷的相反数,
以上提到的所有Double类型的数值形式都可以相互运算,并会给出合法的运算结果,运算结果仍然是Double类型,在运算空间内是封闭的
其中Double.NaN、Double.PositiveInfinity、Double.NegativeInfinity是抽象意义的常数
以下是关于Double类型一些案例运算效果
double最大值
double.MaxValue
1.7976931348623157E+308
double无穷大
double.PositiveInfinity
Infinity
无穷大大于最大值
double.PositiveInfinity>double.MaxValue
true
double类型的数据0可以做分母
1/0 == double.PositiveInfinity
error CS0020: Division by constant zero
1D/0D == double.PositiveInfinity
true
new System.Double(){ }==0
true
不满足结合律
double.Epsilon/2 + double.Epsilon/2 == 0
true
(double.Epsilon + double.Epsilon)/2 == 0
false
不满足加法交换律
double.MaxValue + double.Epsilon - double.Epsilon == double.MaxValue - double.Epsilon + double.Epsilon
false
不满足乘法交换律
double.Epsilon/double.Epsilon*double.Epsilon
4.94065645841247E-324
double.Epsilon*double.Epsilon/double.Epsilon
0
double.Epsilon/double.Epsilon*double.Epsilon == double.Epsilon*double.Epsilon/double.Epsilon
false
无穷大相乘仍然是无穷大
double.PositiveInfinity*double.PositiveInfinity
Infinity
多个无穷大相乘等于无穷大(没有真正意义的高阶无穷大)
double.PositiveInfinity*double.PositiveInfinity>double.PositiveInfinity
false
无穷大乘以最小精度仍然是无穷大(没有真正意义的无穷小)
double.Epsilon *double.PositiveInfinity
Infinity
1/double.PositiveInfinity == double.Epsilon
false
正无穷加负无穷等于异常值
double.PositiveInfinity-double.PositiveInfinity
NaN
null与Double.Nan相加等于null(任何数与Null做运算仍为Null,任何非null数与Nan做运算等于Nan)
null+double.NaN
null
(1/double.PositiveInfinity)*(1/double.PositiveInfinity)
0
(1/double.PositiveInfinity)/(1/double.PositiveInfinity)
NaN
double.Epsilon
4.94065645841247E-324
double.Epsilon/2
0
2+double.Epsilon
2
2+double.Epsilon>2
false
2-double.Epsilon
2
double.Epsilon/2>0
false
double.Epsilon/2==0
true
-double.Epsilon/2==0
true
Math.Pow(double.Epsilon,2)
0
Math.Pow(double.Epsilon,2)==double.Epsilon*double.Epsilon
true
Math.Pow(double.Epsilon*double.Epsilon,0.5)==double.Epsilon*double.Epsilon
true
double.Epsilon/double.Epsilon
1
double.Epsilon*double.Epsilon/double.Epsilon
0