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

什么时候有人会用这些?


当前回答

+---------+----------------+---------+----------+---------------------------------------------------------+
| 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                                           |
+---------+----------------+---------+----------+---------------------------------------------------------+

请参阅此处了解更多信息。

其他回答

没有人提到

在默认设置中,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;

所有这些类型的问题是存在一定的不精确性而且这个问题可能发生在小的小数上,如下面的例子

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If

问题:bLower变量包含哪个值?

答案:在32位机器上,bLower包含TRUE!!!

如果我将Double替换为Decimal,bLower包含FALSE,这是一个好答案。

在double中,问题是fMean fDelta=1.09999999999,低于1.1。

注意:我认为同样的问题肯定会出现在其他数字上,因为十进制只是精度更高的双精度,而且精度总是有限制的。

事实上,Double、Float和Decimal对应于COBOL中的二进制十进制!

很遗憾,在.Net中不存在COBOL中实现的其他数字类型

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 

对于游戏和嵌入式系统等内存和性能都至关重要的应用程序,浮点运算通常是数字类型的选择,因为它速度更快,大小只有双倍运算的一半。整数曾经是首选的武器,但在现代处理器中,浮点性能已经超过了整数。十进制是正确的!

Double和float可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。

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

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