.NET中decimal,float和double的区别?
.NET中的decimal
, float
和double
什么区别?
什么时候会有人使用其中之一?
float
和double
是浮点二进制点类型。 换句话说,他们代表了这样一个数字:
10001.10010110011
二进制数和二进制点的位置都在该值内编码。
decimal
是浮点小数点类型。 换句话说,他们代表了这样一个数字:
12345.65789
同样,小数点的位置和数字都被编码在值中 - 这就是使decimal
仍然是浮点类型而不是固定点类型的原因。
重要的是要注意的是,人类习惯用十进制形式表示非整数,并期望十进制表示中的确切结果; 并非所有的十进制数都可以在二进制浮点数中精确表示 - 例如0.1 - 所以如果使用二进制浮点数值,则实际上会得到0.1的近似值。 例如,当使用浮动小数点时,您仍会得到近似值 - 例如,除以1除以3的结果不能被精确表示。
至于什么时候使用:
对于“自然精确小数”的值,使用decimal
是很好的。 这通常适用于人类发明的任何概念:金融价值是最明显的例子,但也有其他概念。 例如,考虑给予潜水员或溜冰者的分数。
对于自然界更多的人为因素,无论如何都无法准确测量, float
/ double
更合适。 例如,科学数据通常以这种形式表示。 在这里,原始值不会以“小数精度”开始,所以对于预期结果来说,保持“小数精度”并不重要。 浮点二进制点类型比小数点处理速度快得多。
精度是主要区别。
浮动 - 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
十进制结构严格适用于要求精确度的财务计算,这些计算相对不能四舍五入。 小数对于科学应用来说是不够的,但是,出于以下几个原因: