Fac*_*oni 6 c# floating-point decimal
decimal在 C# 中使用或之间有什么区别float?我知道float用于更精确的小数,并且decimal用于货币或价格等小数位数,但是当它用于小数位数时,为什么使用而不是decimal更好float?
Afloat是浮点二进制类型,这意味着,在底层,它是一个二进制尾数,后跟一个二进制指数,采用形式mantissa x 10 ^ exponent,10即二进制中的数字 2。例如,数字 3.0 表示为1.1 x 10^1,数字 8 1/2 表示为1.0001 x 10^11。它本质上以二进制分数的形式表示数字。以 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 为底的分数的总和以接近表示它。因此,您最终会得到 0011 不断重复的浮点表示1.001100110011001100110011 x 10^-1,因为以 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)。很漂亮,不是吗?
不幸的是,这是有代价的。对 type 的操作比对ordecimal的操作慢得多。几乎人类已知的每台计算机中的处理器都是二进制处理器(我说“几乎每台”是因为我无法反驳地球上某个地方存在非二进制计算机)。这意味着它本身支持二进制加法、减法等。诸如编译为简单指令之类的操作,其中浮点数的指数会递减。但是,会编译为更复杂的指令集,因为数字不存储为二进制分数,并且必须考虑数字的特殊基数 10 表示形式。floatdoublefloat x = 256.0 / 2;decimal x = 256.0m / 2;
一般来说,如果您需要的速度超过十进制精度,则float或double就足以满足您的应用程序。但是,如果您首先需要小数精度(例如会计),那么decimal要使用的类型。
有关更多详细信息,请参阅此 MSDN 文档。