C#中的float,double以及decimal

    浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法

计算机中的浮点数

    浮点指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度。大部份计算机采用二进制(b=2)的表示方法。(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数(通常用软件实现)。

 

1、decimal类型用来表示高精度的浮点数。decimal的有效位数很大,达到了28位,但是表示的数据范围却比float和double类型小。

decimal类型并不是C#中的基础类型,所以使用的时候会对计算时的性能有影响。

浮点数在进行运算时,会出现精度丢失的情况,精度的相互转换,也会出现丢失精度的情况。

 

2、浮点数的精度损失可能在很多地方出现,例如d   *   g   /   g   不一定等于d,d   /   g   *   g也不一定等于d。 

 

3、float 关键字表示存储 32 位浮点值的简单类型。(特别说明C#中的float和Single其实是同一个类型,在代码中写出来,并转到定义,就可以发现了)

默认情况下,赋值运算符右侧的实数被视为 double。 因此,应使用后缀 F或者f。

double 关键字表示存储 64 位浮点值的简单类型 。

默认情况下,赋值运算符右侧的实数被视为 double。 但是,如果希望整数被视为 double,请使用后缀 d 或 D,例如:double x = 3D;

decimal 关键字表示 128位数据类型,同浮点型相比,decimal类型拥有更高的精度和更小的数据范围,这让它更适合财务和货币计算。应使用后缀M或者m。

根据上面的维基百科对于浮点数的定义,那么decimal类型表示的也是浮点值。

当然,decimal在大多数情况下是安全的,但浮点数在理论上是不安全的。

 

4、下面是一个简单的示例代码:

double d1 = 2.0d;
            double d2 = 1.8d;

            float f1 = 2.0f;
            float f2 = 1.8f;

            Single s1 = 2.0f;
            Single s2 = 1.8f;

            Single s3 = s1 - s2;

            decimal m1 = 2.0m;
            decimal m2 = 1.8m;

            double d3 = d1 + d2;
            double d4 = d1 - d2;
            double d5 = d1* d2;
            double d6 = d1 / d2;

            float f3 = f1 + f2;
            float f4 = f1 - f2;
            float f5 = f1 * f2;
            float f6 = f1 / f2;

            decimal m3 = m1 + m2;
            decimal m4 = m1 - m2;
            decimal m5 = m1 * m2;
            decimal m6 = m1 / m2;

            decimal m7 = Convert.ToDecimal(f2);
            decimal m8 = Convert.ToDecimal(d2);

            double d7 = f2;
            double d8 = Convert.ToDouble(m2);
            double d9 = (double)m2;

            float f7 = (float)d2;
            float f8 = (float)m2;

            int n1 = int.Parse(d2.ToString());
            int n2 = Convert.ToInt32(d2);

代码本身就是为了测试各个类型,请观察各个变量的值,s3,d4,f4的值都不等于我们预期的0.2,这就是浮点数运算中的精度丢失。

本篇仅记录基本的数据类型,供自己查阅,也供大家参考。

posted @ 2013-04-27 16:39  路灯下的诗人  阅读(3464)  评论(0编辑  收藏  举报