关于浮点:C中的”十进制”和”浮点”有什么区别? ‘decimal’ 和 ‘float’

What is the difference between 'decimal' and 'float' in C#?

本问题已经有最佳答案,请猛点这里访问。

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


float是一种浮点二进制类型,也就是说,它是一个二进制尾数,后面跟一个二进制指数,形式为mantissa x 10 ^ exponent10是二进制中的数字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;编译成一组更复杂的指令,因为数字不是以二进制小数形式存储的,必须考虑数字的特殊base-10表示。

一般来说,如果您需要的速度超过十进制精度,那么floatdouble就足以满足您的应用。但是,如果您要求小数精度高于其他所有要求,例如会计,那么decimal是要使用的类型。

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


十进制将有128位,仅浮动32位来表示数字。


The decimal keyword indicates a 128-bit data type. Compared to floating-point types, the decimal type has more precision and a smaller range, which makes it appropriate for financial and monetary calculations. The approximate range and precision for the decimal type are shown in the following table.

(-7.9 x 1028 to 7.9 x 1028) / (10^0 - ^28), 28-29 significant digits

来自MSDN

另一方面,浮动:

The float keyword signifies a simple type that stores 32-bit floating-point values. The following table shows the precision and approximate range for the float type.

-3.4 × 10^38 to +3.4 × 10^38, 7 significant digits

链接