在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
简单地说:
Decimal、Double和Float变量类型在存储值的方式上有所不同。精度是主要区别(请注意,这不是唯一的区别),其中float是单精度(32位)浮点数据类型,double是双精度(64位)浮点类型,decimal是128位浮点数据类型。汇总表:
/==========================================================================================类型钻头达到近似范围/==========================================================================================浮动32位7位数-3.4×10^(38)到+3.4×10^双64 15-16位数字±5.0×10^(-324)至±1.7×10^十进制128 28-29有效数字±7.9 x 10^(28)或(1至10^(29)/==========================================================================================你可以在这里阅读更多,浮点,双精度和十进制。
其他回答
精度是主要区别。
浮点-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(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的结果无法精确表示。
至于在以下情况下使用什么:
对于“自然精确小数”的值,最好使用小数。这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或滑冰运动员的分数。对于那些本质上更为人为的、无论如何都无法精确测量的值,浮点/双精度更为合适。例如,科学数据通常以这种形式表示。在这里,原始值从一开始就不是“小数精度”的,因此对于预期结果来说,保持“小数精度精度”并不重要。浮点二进制点类型比小数更快。
每种方法的主要区别在于精度。
float是32位数字double是64位数字十进制是128位数字
浮动:±1.5 x 10^-45至±3.4 x 10^38(~7个有效数字双倍:±5.0 x 10^-324至±1.7 x 10^308(15-16个有效数字)小数:±1.0 x 10^-28至±7.9 x 10^28(28-29个有效数字)
+---------+----------------+---------+----------+---------------------------------------------------------+
| C# | .Net Framework | Signed? | Bytes | Possible Values |
| Type | (System) type | | Occupied | |
+---------+----------------+---------+----------+---------------------------------------------------------+
| sbyte | System.Sbyte | Yes | 1 | -128 to 127 |
| short | System.Int16 | Yes | 2 | -32,768 to 32,767 |
| int | System.Int32 | Yes | 4 | -2,147,483,648 to 2,147,483,647 |
| long | System.Int64 | Yes | 8 | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| byte | System.Byte | No | 1 | 0 to 255 |
| ushort | System.Uint16 | No | 2 | 0 to 65,535 |
| uint | System.UInt32 | No | 4 | 0 to 4,294,967,295 |
| ulong | System.Uint64 | No | 8 | 0 to 18,446,744,073,709,551,615 |
| float | System.Single | Yes | 4 | Approximately ±1.5e-45 to ±3.4e38 |
| | | | | with ~6-9 significant figures |
| double | System.Double | Yes | 8 | Approximately ±5.0e-324 to ±1.7e308 |
| | | | | with ~15-17 significant figures |
| decimal | System.Decimal | Yes | 16 | Approximately ±1.0e-28 to ±7.9e28 |
| | | | | with 28-29 significant figures |
| char | System.Char | N/A | 2 | Any Unicode character (16 bit) |
| bool | System.Boolean | N/A | 1 / 2 | true or false |
+---------+----------------+---------+----------+---------------------------------------------------------+
请参阅此处了解更多信息。