一尘不染

.NET和.NETdecimal中有什么区别?floatdouble

javascript

.NET和.NETdecimal中有什么区别?floatdouble


阅读 162

收藏
2022-02-09

共2个答案

一尘不染

float并且double浮点二进制点类型。换句话说,它们代表这样的数字:

10001.10010110011

二进制数和二进制点的位置都在值内编码。

decimal浮点数类型_ 换句话说,它们代表这样的数字:

12345.65789

同样,数字和小数点的位置都在值内编码——这就是decimal仍然是浮点类型而不是定点类型的原因。

需要注意的重要一点是,人类习惯于以十进制形式表示非整数,并期望以十进制表示的精确结果;并非所有十进制数都可以用二进制浮点数精确表示——例如 0.1——所以如果你使用二进制浮点值,你实际上会得到一个 0.1 的近似值。当使用浮点小数点时,您仍然会得到近似值——例如,无法精确表示 1 除以 3 的结果。

至于什么时候用:

  • 对于“自然精确小数”的值,最好使用decimal. 这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或溜冰者的分数。
  • 对于更多的自然产物,无论如何都无法准确测量的值float /double更合适。例如,科学数据通常会以这种形式表示。在这里,原始值一开始就不是“十进制精度”,因此保持“十进制精度”对于预期结果并不重要。浮点二进制点类型比小数要快得多。
2022-02-09
一尘不染

精度是主要区别。

浮点数- 7 位(32 位)

double-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
2022-02-09