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
十进制结构严格适用于要求准确性的财务计算,这对于舍入是相对不容忍的。然而,小数不足以用于科学应用,原因如下: