协慌网

登录 贡献 社区

.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 ,而小数是用软件计算的)。
  • 尽管它支持更多的精度数字,但 Decimal 的值范围比 double 小得多。因此,Decimal 不能用于表示许多科学价值。