C#中'decimal'和'float'有什么区别?

时间:2015-10-26 18:30:07

标签: c# floating-point decimal

在C#中使用decimalfloat之间的区别是什么?我知道float用于更精确的十进制数,decimal用于少数小数,如货币或价格,但当它用于少数小数时,为什么最好使用decimal而不是{{ 1}}?

3 个答案:

答案 0 :(得分:1)

  

decimal关键字表示128位数据类型。与浮点类型相比,十进制类型具有更高的精度和更小的范围,这使其适用于财务和货币计算。十进制类型的近似范围和精度如下表所示。

     

( - 7.9 x 1028 to 7.9 x 1028)/(10 ^ 0 - ^ 28),28-29位有效数字

From MSDN

另一方面漂浮:

  

float关键字表示存储32位浮点值的简单类型。下表显示了浮点类型的精度和近似范围。

     

-3.4×10 ^ 38至+3.4×10 ^ 38,7位有效数字

Link

答案 1 :(得分:1)

十进制将有128位,只有32位用于表示数字

答案 2 :(得分:1)

float是浮点二进制类型,这意味着,在引擎盖下,它是二进制尾数,后跟二进制指数,形式为mantissa x 10 ^ exponent10为二进制数字2。例如,数字3.0表示为1.1 x 10^1,数字8 1/2表示为1.0001 x 10^11。它基本上以二进制分数的形式表示数字。 base-2浮点数的问题在于难以精确表示不是2的因子的十进制数。

以浮点二进制格式表示1/2,1 / 4,1 / 8,1 / 16等值很容易。 1/2只是0.1,1/4是0.01,1/8是0.001,等等。但是如果要表示像0.6这样的小数值,则需要构建一个基数为2的分数之和接近代表它。所以你最终得到1.001100110011001100110011 x 10^-1的浮点表示,其中0011只是不断重复,因为在base-2中没有十进制0.6的有理表示。

这是decimal类型的来源。decimal类型不使用小数二进制表示,而是使用符号位,96位整数有效数和整数比例因子来表示值,采用(sign x significand) / (10 ^ scaling factor)形式。符号可以是0或1,有效数可以是0到2 ^ 96 - 1之间的任何值,缩放因子可以是0到28之间的任何值。这意味着数字在引擎盖下表示为小数部分而不是二元分数,因此我们人类习惯使用的数字可以在引擎盖下以合理的形式精确而准确地表示。与我们之前看到的0.6的丑陋和不精确的二进制表示不同,decimal类型表示0.6是一个很好的干净(1 x 6) / (10 ^ 1)。漂亮,不是吗?

不幸的是,这需要付出代价。 decimal类型的操作比floatdouble上的操作慢得多。几乎人类已知的每台计算机中的处理器都是二进制处理器(我说“几乎每一个”因为我不能反驳地球上某处非二进制计算机的存在)。这意味着它本身支持二进制加法,减法等。像float x = 256.0 / 2;这样的操作编译成一个简单的指令,其中浮点数的指数递减。但是,decimal x = 256.0m / 2;编译为更复杂的指令集,因为该数字不会存储为二进制小数,并且必须考虑该数字的特殊基数10表示。

通常,如果您要求的速度超过小数精度,floatdouble就足以满足您的应用需求。但是,如果您要求小数精度高于其他所有值,例如会计,则decimal是要使用的类型。

有关详细信息,请参阅this MSDN documentation