zoukankan      html  css  js  c++  java
  • C#中的float,double以及decimal

        浮点数是属于有理数中某特定子集的数的数字表示,在计算机中用以近似表示任意某个实数。具体的说,这个实数由一个整数定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,这种表示方法类似于基数为10的科学记数法

    计算机中的浮点数

        浮点指的是带有小数的数值,浮点运算即是小数的四则运算,常用来测量电脑运算速度。大部份计算机采用二进制(b=2)的表示方法。(bit)是衡量浮点数所需存储空间的单位,通常为32位或64位,分别被叫作单精度双精度。有一些计算机提供更大的浮点数,例如英特尔公司的浮点运算单元Intel8087协处理器(以及其被集成进x86处理器中的后代产品)提供80位长的浮点数,用于存储浮点运算的中间结果。还有一些系统提供128位的浮点数(通常用软件实现)。

    1、decimal类型用来表示高精度的浮点数。decimal的有效位数很大,达到了28位,但是表示的数据范围却比float和double类型小。

    decimal类型并不是C#中的基础类型,所以使用的时候会对计算时的性能有影响。

    浮点数在进行运算时,会出现精度丢失的情况,精度的相互转换,也会出现丢失精度的情况。

    2、浮点数的精度损失可能在很多地方出现,例如d   *   g   /   g   不一定等于d,d   /   g   *   g也不一定等于d。 

    3、float 关键字表示存储 32 位浮点值的简单类型。(特别说明C#中的float和Single其实是同一个类型,在代码中写出来,并转到定义,就可以发现了)

    默认情况下,赋值运算符右侧的实数被视为 double。 因此,应使用后缀 F或者f。

    double 关键字表示存储 64 位浮点值的简单类型 。

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

    decimal 关键字表示 128位数据类型,同浮点型相比,decimal类型拥有更高的精度和更小的数据范围,这让它更适合财务和货币计算。应使用后缀M或者m。

    根据上面的维基百科对于浮点数的定义,那么decimal类型表示的也是浮点值。

    当然,decimal在大多数情况下是安全的,但浮点数在理论上是不安全的。

    4、下面是一个简单的示例代码:

    double d1 = 2.0d;
                double d2 = 1.8d;
    
                float f1 = 2.0f;
                float f2 = 1.8f;
    
                Single s1 = 2.0f;
                Single s2 = 1.8f;
    
                Single s3 = s1 - s2;
    
                decimal m1 = 2.0m;
                decimal m2 = 1.8m;
    
                double d3 = d1 + d2;
                double d4 = d1 - d2;
                double d5 = d1* d2;
                double d6 = d1 / d2;
    
                float f3 = f1 + f2;
                float f4 = f1 - f2;
                float f5 = f1 * f2;
                float f6 = f1 / f2;
    
                decimal m3 = m1 + m2;
                decimal m4 = m1 - m2;
                decimal m5 = m1 * m2;
                decimal m6 = m1 / m2;
    
                decimal m7 = Convert.ToDecimal(f2);
                decimal m8 = Convert.ToDecimal(d2);
    
                double d7 = f2;
                double d8 = Convert.ToDouble(m2);
                double d9 = (double)m2;
    
                float f7 = (float)d2;
                float f8 = (float)m2;
    
                int n1 = int.Parse(d2.ToString());
                int n2 = Convert.ToInt32(d2);

    代码本身就是为了测试各个类型,请观察各个变量的值,s3,d4,f4的值都不等于我们预期的0.2,这就是浮点数运算中的精度丢失。

    本篇仅记录基本的数据类型,供自己查阅,也供大家参考。

  • 相关阅读:
    归并排序
    堆排序
    数组数据生成器
    冒泡排序
    快速排序
    希尔排序
    排序接口与抽象类(java)
    Pycharm下HTMLTestRunner不生成测试报告
    抓包工具使用记录
    接口学习笔记
  • 原文地址:https://www.cnblogs.com/flyinghigher/p/3047426.html
Copyright © 2011-2022 走看看