避免对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要小。
Tag标签: decimal
posted @ 2008-07-06 21:14 Baozi 阅读(738) 评论(3)  编辑 收藏 网摘 所属分类: 开发技术

  回复  引用  查看    
#1楼 2008-07-06 23:20 | superwulei      
我理解的decimal就是通常我们在数学计算中的十进制数,而不是计算机中的浮点数。浮点数由于是计算机内部求补运算而进行的,因此可能存在误差。
  回复  引用  查看    
#2楼 [楼主]2008-07-06 23:40 | Ethan      
@superwulei
基本数字类型都是有精度和范围的,因为我们平时很少碰到这样的情况,所以大家平时都不会很注意。我觉得像Baidu,Google,ebay这种有海量数据的企业,肯定很多时候都要考虑这种问题。
  回复  引用    
#3楼 2008-08-02 17:30 | zhangyun [未注册用户]
数学中的实数和计算机中的浮点数是不同的,浮点数实际上就是在有限的计算机资源上对实数的近似表示。这个问题导致许多几何算法都不能用在实际当中,虽然有许多浮点运算误差的模型,但目前科学家对这个问题的解决方式并不优雅。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-06 22:51 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:


相关搜索:
decimal

相关链接: