有什么区别 decimal
, float
和 double
在.NET?
什么时候会有人使用其中一种?
有什么区别 decimal
, float
和 double
在.NET?
什么时候会有人使用其中一种?
float
和 double
是 漂浮的 二进制 点类型。换句话说,它们代表了这样的数字:
10001.10010110011
二进制数和二进制点的位置都在该值内编码。
decimal
是一个 漂浮的 十进制 点类型。换句话说,它们代表了这样的数字:
12345.65789
再次,数量和位置 十进制 point都是在值内编码的 - 这就是它的作用 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
十进制结构严格适用于要求准确性的财务计算,这对于舍入是相对不容忍的。然而,小数不足以用于科学应用,原因如下:
有关更多信息,您可以访问此图片的来源:
float
7位精度
double
有大约15位数的精度
decimal
有大约28位数的精度
如果您需要更高的精确度,请使用double而不是float。 在现代CPU中,两种数据类型具有几乎相同的性能。使用浮动的唯一好处是它们占用的空间更少。只有当你有很多这样的事情时才真正重要。
我发现这很有趣。 每个计算机科学家应该知道的浮点运算
没有人提到这一点
在默认设置中,Floats(System.Single)和double(System.Double)将永远不会使用 溢出检查,而Decimal(System.Decimal)将始终使用 溢出检查。
我的意思是
decimal myNumber = decimal.MaxValue;
myNumber += 1;
投 发生OverflowException。
但这些不是:
float myNumber = float.MaxValue;
myNumber += 1;
&
double myNumber = double.MaxValue;
myNumber += 1;
我不会重复已经在其他答案和评论中回答的大量好的(和一些坏的)信息,但我会用一个提示回答你的后续问题:
什么时候会有人使用其中一种?
使用小数表示 计 值
使用float / double 测量 值
一些例子:
钱(我们数钱还是衡量钱?)
距离(我们计算距离还是测量距离?*)
分数(我们计算分数还是衡量分数?)
我们总是数钱,不应该衡量它。我们通常测量距离。我们经常算得分。
*在某些情况下,我会称之为 名义距离,我们可能确实想要“计算”距离。例如,也许我们正在处理显示到城市的距离的国家标志,我们知道那些距离永远不会超过一个十进制数字(xxx.x km)。
Decimal,Double和Float变量类型在存储值方面有所不同。精度是主要区别,其中float是单精度(32位)浮点数据类型,double是双精度(64位)浮点数据类型,decimal是128位浮点数据类型。
浮动 - 32位(7位)
双 - 64位(15-16位)
十进制 - 128位(28-29位有效数字)
主要区别是Floats和Doubles是二进制浮点类型,Decimal将值存储为浮点小数点类型。因此,小数具有更高的精度,通常用于需要高精度的货币(金融)或科学计算应用中。但在性能方面,Decimals比double和float类型慢。
十进制可以100%准确地表示十进制格式精度内的任何数字,而Float和Double则无法准确表示所有数字,甚至是各自格式精度的数字。
十进制
在财务应用或科学计算的情况下,最好使用十进制类型,因为它可以提供高水平的准确性并且易于避免舍入误差
双
除处理货币外,双类型可能是实际值最常用的数据类型。
浮动
它主要用于图形库,因为对处理能力的要求非常高,也使用了可以承受舍入误差的情况。
如前所述,整数是整数。他们无法存储点数,例如.7,.42和.007。如果您需要存储非整数的数字,则需要使用不同类型的变量。您可以使用double类型或float类型。您以完全相同的方式设置这些类型的变量:而不是使用单词 int
,你输入 double
要么 float
。喜欢这个:
float myFloat;
double myDouble;
(float
是“浮点”的缩写,只是意味着最后有一点点的数字。)
两者之间的差异在于它们可以容纳的数字的大小。对于 float
,您的号码最多可以包含7位数字。对于 double
s,最多可以有16位数字。更确切地说,这是官方规模:
float: 1.5 × 10^-45 to 3.4 × 10^38
double: 5.0 × 10^-324 to 1.7 × 10^308
float
是一个32位数字,和 double
是一个64位数字。
双击新按钮以获取代码。将以下三行添加到按钮代码中:
double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
暂停程序并返回编码窗口。改变这一行:
myDouble = 0.007;
myDouble = 12345678.1234567;
运行程序并单击双击按钮。消息框正确显示数字。但是,最后添加另一个数字,C#将再次向上或向下舍入。道德是如果你想要准确,小心四舍五入!
这对我来说是一个有趣的线索,因为今天,我们刚刚遇到了一个令人讨厌的小虫子 decimal
精度低于a float
。
在我们的C#代码中,我们从Excel电子表格中读取数值,并将它们转换为 decimal
,然后发送 decimal
回到服务保存到 SQL Server 数据库。
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
decimal value = 0;
Decimal.TryParse(cellValue.ToString(), out value);
}
现在,为 几乎全部 我们的Excel值,这非常有效。但对于一些非常小的Excel值,使用 decimal.TryParse
完全失去了价值。一个这样的例子是
cellValue = 0.00006317592
Decimal.TryParse(cellValue.ToString(),out value); //会回来 0
奇怪的是,解决方案是将Excel值转换为 double
首先,然后进入 decimal
:
Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
double valueDouble = 0;
double.TryParse(cellValue.ToString(), out valueDouble);
decimal value = (decimal) valueDouble;
…
}
即使 double
精度低于a decimal
,这实际上确保了小数字仍然可以被识别。因为某些原因, double.TryParse
实际上能够检索到这么小的数字,而 decimal.TryParse
将它们设置为零。
奇。很奇怪。