C#的数据类型总结:decimal ,double,float的区别
原文链接:https://www.cnblogs.com/mrbug/p/6904039.html
double虽然64位,但其精度低,故其可以表示的范围大
decimal虽然是128位,但由于其用了较多的位来表示其精度,只好牺牲表示范围了.
1> 三者是精度不同的浮点数,如下图
参见:https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/language-reference/keywords/float
2> 写法
默认情况下,赋值运算符右侧的实数被视为 double。 但是,如果希望整数被视为 double,可使用后缀 d 或 D,例如:
1
|
double d = 3D; |
若要初始化浮点型变量,请使用后缀 f
或 F
,如以下示例中所示:
1
|
float f = 17.5F; |
如果希望实数被视为 decimal 类型,请使用后缀 m 或 M,例如:
1
|
decimal m = 17.5m; |
3>关于它们的错误认识
在精确计算中使用浮点数是非常危险的,尽管C#在浮点数运算时采取了很多措施使得浮点数运算的结果看起来是非常正常的。但实际上如果不清楚浮点数的特性而贸然使用的话,将造成非常严重的隐患。
1、decimal不是浮点型、decimal不存在精度损失。
下面有段程序大家可以去看看结果是什么。记住!所有的浮点型变量都存在精度损失的问题,而decimal是一个不折不扣的浮点型,不论它精度有多高,精度损失依然存在!
1
2
3
|
decimal dd = 10000000000000000000000000000m; dd += 0.1m; Console.WriteLine ( "{0:G50}" , dd ); |
2、decimal所能储存的数比double大,从double到decimal的类型转换不会出现任何问题。
实际上只有从整形到decimal的转换才是扩大转换,decimal的精度比double大,但所能储存的最大数却比double要小。decimal类型具有更高的精度和更小的范围,这使它适合于财务和货币计算。