在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
浮动:±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个有效数字)
其他回答
精度是主要区别。
浮点-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
浮动:
它是一个浮点二进制点类型变量。这意味着它以二进制形式表示数字。浮点是一种单精度32位(6-9位有效数字)数据类型。它主要用于图形库,因为对处理能力的要求非常高,也用于舍入误差不太重要的情况。
双倍:
它也是一个具有双精度和64位大小(15-17位有效数字)的浮点二进制点类型变量。Double可能是真实值最常用的数据类型,但金融应用程序和需要高精度的地方除外。
十进制的:
它是一个浮点型变量。这意味着它使用十进制数字(0-9)表示数字。它使用128位(28-29位有效数字)来存储和表示数据。因此,它比浮点和双精度更高。由于它们的高精度和易于避免舍入误差,它们主要用于金融应用。
例子:
using System;
public class GFG {
static public void Main()
{
double d = 0.42e2; //double data type
Console.WriteLine(d); // output 42
float f = 134.45E-2f; //float data type
Console.WriteLine(f); // output: 1.3445
decimal m = 1.5E6m; //decimal data type
Console.WriteLine(m); // output: 1500000
}
}
浮点、双精度和十进制之间的比较基于:
使用的位数:
浮点使用32位表示数据。Double使用64位表示数据。十进制使用128位表示数据。
数值范围:
浮动值范围约为±1.5e-45至±3.4e38。双倍值范围约为±5.0e-324至±1.7e308。十进制值的范围约为±1.0e-28至±7.9e28。
精度:
浮点以单精度表示数据。双精度表示数据。十进制比浮点和双精度更高。
准确度:
浮点运算不如双精度和小数精度高。双精度比浮点精度高,但比十进制精度低。十进制比浮点和双精度更精确。
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的结果无法精确表示。
至于在以下情况下使用什么:
对于“自然精确小数”的值,最好使用小数。这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或滑冰运动员的分数。对于那些本质上更为人为的、无论如何都无法精确测量的值,浮点/双精度更为合适。例如,科学数据通常以这种形式表示。在这里,原始值从一开始就不是“小数精度”的,因此对于预期结果来说,保持“小数精度精度”并不重要。浮点二进制点类型比小数更快。
所有这些类型的问题是存在一定的不精确性而且这个问题可能发生在小的小数上,如下面的例子
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可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。