float
System.Single
32-bit single-precision floating point
7
±1.5 × 10−45 to ±3.4 × 1038
double
System.Double
64-bit double-precision floating point
15/16
±5.0 × 10 −324 to ±1.7 × 10308
如果我们在代码中写一个12.3,编译器会自动认为这个数是个double型。所以如果我们想指定12.3为float类型,那么你必需在数字后面加上F/f:
float f = 12.3F;
decimal类型
作为增补,decimal类型用来暗示高精度的浮点数
Name
CTS Type
Description
Significant Figures
Range (approximate)
decimal
System.Decimal
128-bit high precision decimal notation
28
±1.0 × 10−28 to ±7.9 × 1028
从上表可以看出,decimal的有效位数很大,到达了28位,但是暗示的数据范畴却比float和double类型小。decimal类型并不是C#中的根本类型,所以使用的时候会对计算时的性能有影响。
我们可以像如下的方法界说一个decimal类型的浮点数:
decimal d = 12.30M;
对decimal、float、double错误的认识
在精确计算中使用浮点数长短常危险的,尽管C#在浮点数运算时采纳了很多法子使得浮点数运算的功效看起来长短常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,,将造成非常严重的隐患。考虑下面的语句:
double dd = 10000000000000000000000d; dd += 1; Console.WriteLine ( "{0:G50}", dd );
输出是什么?谁知道?
输出是:1000000000000000000000000
这就是浮点数精度损掉的问题,最重要的是,在精度损掉的时候,不会呈报任何的错误,也不会有任何的异常孕育产生。浮点数的精度损掉可能在很多处所呈现,例如d * g / g 不必然即是d,d / g * g也不必然即是d。
还有两个非常危险的错误认识!!
1、decimal不是浮点型、decimal不存在精度损掉。
下面有段措施大家可以去看当作果是什么。记住!所有的浮点型变量都存在精度损掉的问题,而decimal是一个不折不扣的浮点型,岂论它精度有多高,精度损掉依然存在!
decimal dd = 10000000000000000000000000000m; dd += 0.1m; Console.WriteLine ( "{0:G50}", dd );
2、decimal所能储存的数比double大,从double到decimal的类型转换不会呈现任何问题。
微软在decimal的辅佐上真的要好好反省了。实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。
decimal的应用场景
“decimal 类型是适合财务和货币计算的 128 位数据类型。”
固然,decimal在大大都情况下是安适的,但浮点数在理论上是不安适的。
至于精度误差造成的显示问题,则是很容易修补的。浮点数会带来的问题以及整型能制止的问题就是一个:
譬如说从A帐户转账到B帐户,经计算得出功效是3.788888888888888元,那么我们从A帐户扣除这么多钱,B帐户增加这么多钱,但事实上A帐户不必然会扣除准确的数值,例如A帐户的金额在100000000000,那么这个时候100000000000 - 3.788888888888888运算功效很有可能是99999999996.211111111111112。而这个时候B帐户的金额为0则很有可能加上准确的数值,如3.788888888888888,这样一来,0.011111111111112元钱就会不见了,日积月累的,差额就会越来越大。
double是64位的,比single-32位精度高。decimal是128位高精度浮点数,常用于金融运算,不容易呈现浮点数计算的误差,decimal类型具有更高的精度和更小的范畴,这使它适合于财务和货币计算。
一个例子
早上刚到办公室,就被中试室打来电话叫去,本来软件在测试过程中发明了个小问题:软件读出来的数据比设备LCD上显示数据小了 0.01 。
怎么会这样呢,数据类型我已经用了 double 型了整个数据长度也就6位,double型的数据有效数据位为7位,也够了阿,不大白。于是回来下断点跟踪。