'小数'和& # 39;浮动# 39;在c#

本文关键字:小数 浮动 | 更新日期: 2023-09-27 18:19:23

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

'小数'和& # 39;浮动# 39;在c#

float是一个浮点二进制类型,这意味着,在底层,它是一个二进制尾数后跟一个二进制指数,形式为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为底的分数的和来接近地表示它。因此,您最终得到1.001100110011001100110011 x 10^-1的浮点表示法,其中0011只是不断重复,因为在以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类型。

有关详细信息,请参阅此MSDN文档。

decimal关键字表示128位数据类型。与浮点类型相比,小数类型具有更高的精度和更小的范围,这使得它适合于金融和货币计算。小数类型的大致范围和精度如下表所示。

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

从MSDN

另一方面:

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

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

链接

Decimal将有128位,浮点数只有32位