说说C#的数学类,Math,浮点数(上)

来源:互联网 发布:淘宝官网 编辑:程序博客网 时间:2024/05/17 23:53

说说C#的数学类,Math,浮点数

C#语言支持下图所示的数值类型,分别是整数,浮点数和小数

 

可能不是很清楚,但是仔细看看还是能看清楚的.

在一个C#程序中,整数(没有小数点的数)被认为是一个int类型(除非其值大于最大的int),根据数据值,该数据依次被视为uint,ling,ulong,带小数点的数被认为是一个double.这就是说(1.0).GetType()==typeof(double).

其中类型前面的字母’u’代表无符号的意思.因为无符号,所以u代表了数据是整数或0,不可能是负数.

 

检查整数溢出

考虑下面代码:

short s=32767;s+=1;

ushort us=0;us-=1;

在第一个情况下,一个有符号的数加1,经过其最大值,由于整数在内存中存储方式的原因,结果是-32768.

第二种情况,一个无符号的数被减为小于0,结果将是65535.

这两个例子分别是上溢出和下溢出的情况,如果想避免这种情况的发生,可以使用checked关键字:

short s=32767;

checked

{

s+=1;//将会产生一个上溢出

}

或者使用下面的编译器开关:

/checked+

默认编译器开关对应为:

/checked-

迄今为止,都在收运行时的整数向上或向下溢出检查,在默认情况下编译器会将编译时的向上和向下溢出标记为一个错误,而和你的编译器开关无关.

 

例如语句:short s=32767+1;这会产生一个编译时错误,因为在编译期间对加法进行求值.

 

例如下面这个案例;

const int i1=65536;

const int i2=65536;

int i3=i1*i2;

因为i1,i2都是const,所以编译器在编译的时候会尝试对i3=i1*i2进行求值,并遇到一个向上溢出.所以会导致编译错误.

编译器开关不会覆盖这一行为,但是unchecked关键字可以覆盖这种行为.

int i3=unchecked(i1*i2)可以正常通过编译.

 

 

 

 

小数类型

decimal关键字表示128位数据类型.同浮点型相比,decimal类型具有更高的精度和更小的范围,这使它适合于财务和后比计算.decimal类型的大致范围和精度看上面的图.

它使用16字节(128)存储每一个值.128位被划分为96位整数位,一个符号位,一集一个可以在0-28之间变化的比例因子.在数学上,这个比例因子是一个10的负指数幂,表示数值中小数点位置的编号.

例如,如果一个小数定义等于12.34,那么这个数的存储方式是整数0x4D2(1234),以及一个比例因子2.

 

只要一个小数具有(或小于)28个有效数字以及(或小于)28个小数位置,decimal 数据类型就可以准确的存储它.对于浮点数而言,这是不成立的.\!如果定义一个float值等于12.34,那么它会被存储为0xC570A4(12939428)除以0x100000(1048576),这个值等于12.340000152587890625约等于12.34,即使将一个double值定义为12.34,他也是一个约等于12.34的数.

 

这就是你爱不想让美分神秘的出现和消失的地方执行计算时应该使用decimal的原因,因为浮点数不精确,浮点数据类型在科学和工程应用方面很合适,但是在金融应用不好使.

 

0 0
原创粉丝点击