在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
在.NET中,十进制、浮点和双精度之间有什么区别?
什么时候有人会用这些?
当前回答
Double和float可以被整数零除,在编译和运行时都没有异常。小数不能除以整数零。如果你这样做,编译总是会失败。
其他回答
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的结果无法精确表示。
至于在以下情况下使用什么:
对于“自然精确小数”的值,最好使用小数。这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或滑冰运动员的分数。对于那些本质上更为人为的、无论如何都无法精确测量的值,浮点/双精度更为合适。例如,科学数据通常以这种形式表示。在这里,原始值从一开始就不是“小数精度”的,因此对于预期结果来说,保持“小数精度精度”并不重要。浮点二进制点类型比小数更快。
精度是主要区别。
浮点-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
浮点7位精度
双精度约为15位
十进制大约有28位精度
如果您需要更好的精度,请使用double而不是float。在现代CPU中,两种数据类型的性能几乎相同。使用浮子的唯一好处是它们占用更少的空间。只有当你有很多人的时候,才有实际意义。
我觉得这很有趣。每个计算机科学家都应该知道浮点运算
每种方法的主要区别在于精度。
float是32位数字double是64位数字十进制是128位数字
十进制结构严格适用于要求精确性的财务计算,这些计算相对不允许四舍五入。然而,小数不足以用于科学应用,原因如下:
由于所测量的物理问题或伪影的实际限制,在许多科学计算中,一定程度的精度损失是可以接受的。在金融领域,精度的损失是不可接受的。对于大多数操作,十进制比浮点运算和双精度运算慢得多,这主要是因为浮点运算是以二进制进行的,而十进制运算是以10为基数进行的(即浮点运算和双倍运算是由FPU硬件处理的,如MMX/SSE,而小数是在软件中计算的)。尽管十进制支持更多位数的精度,但它的值范围比双精度小得令人无法接受。因此,十进制不能用来表示许多科学价值。