zoukankan      html  css  js  c++  java
  • 避免对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; //即使为1000000也是错误,但10000000就会正确  
                  Console.WriteLine   (   "{0:G50}",   dd   );   
        
      输出是什么?谁知道?   
      输出是:10000000000000000000000  
        
      这就是浮点数精度损失的问题,最重要的是,在精度损失的时候,不会报告任何的错误,也不会有任何的异常产生。   
        
      浮点数的精度损失可能在很多地方出现,例如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要小。

  • 相关阅读:
    L3-001. 凑零钱(深度优先搜索)
    L2-008. 最长对称子串
    java里面求交集并集补集
    eclipse里面ctrl+T查看继承树,左边的这些绿色红色,F,S,C代表什么意思
    树的遍历(已知前序遍历中序遍历求后序遍历,或者已知后序中序求先序)
    L1-009. N个数求和
    面试题系列之---【MySql事务隔离级别】
    我爱java系列---【待定】
    我爱java系列之---【商城项目微服务鉴权代码实现(二)—JWT在项目中的应用案例】
    我爱java系列之---【JWT实现微服务鉴权(一)】
  • 原文地址:https://www.cnblogs.com/itelite/p/2874879.html
Copyright © 2011-2022 走看看