在.NET中,十进制、浮点和双精度之间有什么区别?

什么时候有人会用这些?


当前回答

没有人提到

在默认设置中,Floats(System.Single)和doubles(System.Double)永远不会使用Decimal(System.Decimal)将始终使用溢出检查。

我是说

decimal myNumber = decimal.MaxValue;
myNumber += 1;

引发OverflowException。

但这些并不:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

其他回答

没有人提到

在默认设置中,Floats(System.Single)和doubles(System.Double)永远不会使用Decimal(System.Decimal)将始终使用溢出检查。

我是说

decimal myNumber = decimal.MaxValue;
myNumber += 1;

引发OverflowException。

但这些并不:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

在.Net(c#)中定义十进制、浮点和双精度

您必须将值提到为:

Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;

并检查结果。

每个占用的字节为

Float - 4
Double - 8
Decimal - 12

精度是主要区别。

浮点-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

每种方法的主要区别在于精度。

float是32位数字double是64位数字十进制是128位数字

float(System.Single的C#别名)和double(System.double的C#别名。float为32位;double是64位。换句话说,它们表示如下数字:

10001.10010110011

二进制数和二进制点的位置都在值中编码。

decimal(System.decimal的C#别名)是浮点小数点类型。换句话说,它们表示如下数字:

12345.65789

同样,小数点的数字和位置都编码在值中——这使得小数点仍然是浮点类型而不是定点类型。

需要注意的重要一点是,人类习惯于以十进制形式表示非整数,并期望以十进制表示得到精确的结果;并不是所有的十进制数字都可以用二进制浮点表示,例如0.1,所以如果使用二进制浮点值,实际上会得到0.1的近似值。当使用浮点小数点时,仍然会得到近似值——例如,1除以3的结果无法精确表示。

至于在以下情况下使用什么:

对于“自然精确小数”的值,最好使用小数。这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或滑冰运动员的分数。对于那些本质上更为人为的、无论如何都无法精确测量的值,浮点/双精度更为合适。例如,科学数据通常以这种形式表示。在这里,原始值从一开始就不是“小数精度”的,因此对于预期结果来说,保持“小数精度精度”并不重要。浮点二进制点类型比小数更快。