您的位置:首页 > 编程语言 > C#

C#中对于float,double,decimal的误解收藏

2009-06-21 20:34 302 查看
C#中对于float,double,decimal的误解收藏
一直很奇怪C#的预定义数据类型中为什么加了一个decimal,有float和double不就够了吗?今天来挖一挖。
浮点型
Name
CTS Type
Description
Significant Figures
Range (approximate)

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错误的认识
引用自:http://topic.csdn.net/t/20050514/20/4007155.html 中Ivony的评论

在精确计算中使用浮点数是非常危险的,尽管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要小。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ccy3253/archive/2008/01/28/2070616.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: