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,这就是浮点数运算中的精度丢失。
本篇仅记录基本的数据类型,供自己查阅,也供大家参考。