.Net Double类型数据问题探究

在.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
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值