C#的数据类型总结(2):decimal ,double,float的区别

1> 三者是精度不同的浮点数,如下图

参见:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/language-reference/keywords/float

 

2> 写法

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

double d = 3D;  

若要初始化浮点型变量,请使用后缀 f 或 F,如以下示例中所示:

float f = 17.5F;  

如果希望实数被视为 decimal 类型,请使用后缀 m 或 M,例如:

decimal m = 17.5m;

 

3>关于它们的错误认识

 在精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。

 1、decimal不是浮点型、decimal不存在精度损失。
 下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!  

 decimal   dd   =   10000000000000000000000000000m;  
 dd   +=   0.1m;  
 Console.WriteLine   (   "{0:G50}",   dd   );   

 2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。

实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。

 

4> 来看几个有趣的程序,值得深思

double   dd   =   10000000000000000000000d;  
dd += 1;
Console.WriteLine ( "{0:G50}", dd );

 你觉得会输出什么?实际上输出的是:1000000000000000000000000  

对,你没有看错,最后那个1不见了,这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。  再来看一个

double dd = 66.24;
dd = dd / 3 * 3;
Console.WriteLine("{0:G50}", dd);

输出会是66.24吗?你自己跑一下,并尝试把double换成decimal试试。关于浮点数精度损失的案例欢迎大家贴出来。

 

posted @ 2017-05-25 15:28  MrBug  阅读(1284)  评论(0编辑  收藏  举报

人生就是一场战斗,唯有披荆斩棘,勇往直前!