.NET中decimal,float和double的区别?

.NET中的decimalfloatdouble什么区别?

什么时候会有人使用其中之一?


floatdouble是浮点二进制点类型。 换句话说,他们代表了这样一个数字:

10001.10010110011

二进制数和二进制点的位置都在该值内编码。

decimal是浮点小数点类型。 换句话说,他们代表了这样一个数字:

12345.65789

同样,小数点的位置和数字都被编码在值中 - 这就是使decimal仍然是浮点类型而不是固定点类型的原因。

重要的是要注意的是,人类习惯用十进制形式表示非整数,并期望十进制表示中的确切结果; 并非所有的十进制数都可以在二进制浮点数中精确表示 - 例如0.1 - 所以如果使用二进制浮点数值,则实际上会得到0.1的近似值。 例如,当使用浮动小数点时,您仍会得到近似值 - 例如,除以1除以3的结果不能被精确表示。

至于什么时候使用:

  • 对于“自然精确小数”的值,使用decimal是很好的。 这通常适用于人类发明的任何概念:金融价值是最明显的例子,但也有其他概念。 例如,考虑给予潜水员或溜冰者的分数。

  • 对于自然界更多的人为因素,无论如何都无法准确测量, float / double更合适。 例如,科学数据通常以这种形式表示。 在这里,原始值不会以“小数精度”开始,所以对于预期结果来说,保持“小数精度”并不重要。 浮点二进制点类型比小数点处理速度快得多。


  • 精度是主要区别。

    浮动 - 7位数字(32位)

    双15-16位(64位)

    十进制-28-29有效数字(128位)

    小数具有更高的精度,通常用于需要高度准确性的财务应用程序中。 小数点比双/浮点数慢得多(在一些测试中高达20倍)。

    小数和浮动/双打无法比较没有投,而浮动和双打可以。 小数也允许编码或尾随零。

    float flt = 1F/3;
    double dbl = 1D/3;
    decimal dcm = 1M/3;
    Console.WriteLine("float: {0} double: {1} decimal: {2}", flt, dbl, dcm);
    

    结果:

    float: 0.3333333  
    double: 0.333333333333333  
    decimal: 0.3333333333333333333333333333
    

    十进制结构严格适用于要求精确度的财务计算,这些计算相对不能四舍五入。 小数对于科学应用来说是不够的,但是,出于以下几个原因:

  • 在许多科学计算中,某些精确度的损失是可以接受的,因为要测量的物理问题或伪影的实际限制。 精确度的损失在财务上是不可接受的。
  • 对于大多数操作来说,十进制比浮点和双精度慢得多(主要是因为浮点运算是以二进制方式完成的,而十进制运算是以10为底)(即浮点和双精度由FPU硬件处理,如MMX / SSE ,而小数则以软件计算)。
  • 尽管支持更多数字的精度,但十进制的值范围小于双精度值,这是不可接受的。 因此,十进制不能用来表示许多科学价值。
  • 链接地址: http://www.djcxy.com/p/483.html

    上一篇: Difference between decimal, float and double in .NET?

    下一篇: What are the correct version numbers for C#?