.NET中的decimal,float和double之间的区别?

2015 .net floating-point double decimal

是什么区别decimal,floatdouble在.NET?

什么时候会有人使用其中一种?

Jon*_*eet 2206

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

10001.10010110011
Run Code Online (Sandbox Code Playgroud)

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

decimal是一个浮点小数点类型.换句话说,它们代表了这样的数字:

12345.65789
Run Code Online (Sandbox Code Playgroud)

同样,小数点的数量和位置都在值内编码 - 这decimal仍然是浮点类型而不是固定点类型.

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

至于什么时候使用:

  • 对于"自然精确小数"的值,使用起来很好decimal.这通常适用于人类发明的任何概念:财务价值是最明显的例子,但也有其他概念.例如,考虑给予潜水员或滑冰者的分数.

  • 如果读入的性质的更加伪影不能真正测量值准确反正float/ double更合适.例如,科学数据通常以这种形式表示.在这里,原始值不会以"十进制精度"开头,因此保持"十进制精度"对于预期结果并不重要.浮点二进制点类型比小数点快得多.

  • 我很惊讶它还没有被说过,`float`是一个C#别名关键字而不是.Net类型.它是`System.Single` ..`single`和`double`是浮点二进制点类型. (104认同)
  • @Hazzard:这就是"二进制点的位置"和答案的一部分意味着什么. (76认同)
  • `float` /`double`通常不代表数字为'101.101110`,通常它表示为类似`1101010*2 ^(01010010)` - 一个指数 (57认同)
  • @BKSpurgeon:嗯,只是以同样的方式你可以说*所有*都是二进制类型,在这一点上它变成了一个相当无用的定义.十进制是一种十进制类型,因为它是一个表示为整数有效数和比例的数字,因此结果是有效数*10 ^ scale,而float和double是有效数*2 ^ scale.你取一个用十进制写的数字,并将小数点移到右边,你有一个整数来计算有效数和比例.对于float/double,你可以用二进制写的数字开头. (52认同)
  • 另一个区别:浮动32位; 双64位; 和十进制128位. (17认同)
  • 等待....最终不是以1和0表示的小数?我以为计算机只能以二进制形式工作.那么十进制最终是二进制类型不是吗? (11认同)
  • 另一个方面是这些数据类型之间的转换:单数据类型和双数据类型 - 使用"模糊"比较 - 从双重到单一的转换失败从单一到双精度转换创建不准确 - 转换到/从十进制引入基数之间的舍入误差-Create关于您正在使用的数据类型的团队一致性[样式指南]并注意转换 (3认同)

cgr*_*eno 1036

精度是主要的区别.

浮动 - 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);
Run Code Online (Sandbox Code Playgroud)

结果:

float: 0.3333333  
double: 0.333333333333333  
decimal: 0.3333333333333333333333333333
Run Code Online (Sandbox Code Playgroud)

  • @Thecrocodilehunter:抱歉,但没有.十进制可以表示可以用十进制表示法表示的所有数字,但不能表示例如1/3.1.0m/3.0m将评估为0.33333333 ...最后有3个大但有限数量的3s.将它乘以3将不会返回精确的1.0. (63认同)
  • @Thecrocodilehunter:我认为你的准确性和精确度令人困惑.在这种情况下,它们是不同的东西.精度是表示数字的可用位数.精度越高,您需要越少.没有数据类型具有无限精度. (47认同)
  • @Thecrocodilehunter:你错过了我的观点.`0.1`是**不是特殊值**!使'0.1`"比'0.10000001`更好"的唯一原因是因为**人类**就像基数10.即使有一个`float`值,如果用同样的方式用'0.1`初始化两个值,*它们都是相同的价值*.只是那个值不会****{0.1` - 它将是*最接近"0.1"的值,可以精确地表示为"浮点数"*.当然,对于二进制浮点数,`(1.0/10)*10!= 1.0`,但有十进制浮点数,`(1.0/3)*3!= 1.0`.****都不是*完美*精确. (25认同)
  • @Thecrocodilehunter:你还是不明白.我不知道如何更明白地说这句话:在C中,如果你做'double a = 0.1; double b = 0.1;`那么`a == b`**将是真的**.这只是'a`和`b`将*两者*不完全等于`0.1`.在C#中,如果你做`decimal a = 1.0m/3.0m; 十进制b = 1.0m/3.0m;`那么`a == b`也是真的.但在那种情况下,**'a`和'b`都不会**完全**等于`1/3' - 它们都等于`0.3333 .......在*两个*情况下,由于表示而丢失一些准确性.你固执地说`decimal`有"无限"的精度,这是*false*. (16认同)
  • @Thecrocodilehunter:你假设正在测量的值是*正好*`0.1` - 这在现实世界中很少见!*任何*有限存储格式都会将无数个可能的值与有限数量的位模式混淆.例如,`float`将汇总`0.1`和​​`0.1 + 1e-8`,而`decimal`将汇总`0.1`和​​`0.1 + 1e-29`.当然,*在给定范围*内,某些值可以任何格式表示,精度损失为零(例如`浮点数'可以存储任何高达1.6e7的整数,且精度损失为零) - 但这仍然不是*无限*准确性. (13认同)
  • @ChibuezeOpata:Skeet的答案讨论了一个完全独立的差异,这个答案完全忽略了.就个人而言,我认为Skeet的答案更有价值,因为他的答案在决定使用哪种数据类型时更为相关. (8认同)
  • 尝试击中头部的另一种尝试:"浮动"和"双重"都可以*完全*表示形式为"p/q"的部分,其中"q"是2的幂.例如0.5,3.25, 1/256等等`decimal`然而**可以*精确*代表`p/q`形式的分数,其中`q`是10(十)的幂.请参阅[此答案](http://stackoverflow.com/a/15348989/2700898).虽然`decimal`有更多有效数字是正确的,但留下它是误导性的;*表示*与`float`和`double`根本不同,它将`decimal`提供给精确的十进制计算. (7认同)
  • @IgbyLargeman精度和准确度用于仪器测量值的上下文中.在这种情况下,我们不是在谈论任何工具.我们只讨论通过十进制与浮点忠实地表示值.精度在这里不适用,因为我们不是在谈论一遍又一遍地测量相同值的一致性.但准确性确实如此.小数点在其范围内的数字的准确度为100%,即无限精度. (6认同)
  • @MystereMan:"在十进制格式的精度范围内"是什么意思?如果你测量的数字恰好是一个整数上升到10的幂,那么绝对使用"十进制".在日常生活中遇到的许多数字具有这种特性(因为它是离散的,而不是连续的测量),但许多其他数字没有.用于任何目的的正确数据类型总是取决于目的.请不要误解我在这里所说的任何暗示任何人应该*总是*使用花车 - 我只是在争论一个人不应该盲目地总是使用`decimal`s. (6认同)
  • 下面是C#的一个小示例代码(本文是关于这个代码),可视化问题(使用decimal和float).`(0.1f == 1f/10)`和`(0.1m == 1m/10)`.第一个将评估为false,而第二个将评估为true,即使两者都应评估为true.这是因为float无法精确存储值0.1. (5认同)
  • 这个答案需要纠正.Decimal的精度不是128位而是无限的,因为格式与float本质上不同.@Skeet答案是最好的.`示例:0.1 = 0.099999 ....在浮点数中但在十进制中它是0.l,即无限精度.如果你使用像浮点数一样的128位精度,你会得到0.999999 ....(最多29位数),但仍然不精确为十进制0.1 (4认同)
  • @ChibuezeOpata不,你不能,因为这个答案甚至没有提到十进制/二进制的区别. (4认同)
  • 这是数字本身的错误(在这种情况下为0.3333 ......),而不是十进制表示,它是100%忠实生成的.当您在数字中引入错误时,没有正文可以删除它(甚至不是十进制数字).从这个数字中删除错误的唯一方法是使用1/3而不是0.333.有些计算器可能会将1/3作为中间值,但大多数计算器不会.`试试这个:浮点数表示0.3333,最终会得到0.3332999998 ......,这不是0.3333(你看错了).现在用十进制表示它是0.3333(完全如此,没有错误 - 100%准确).` (3认同)
  • @DanielPryden,带十进制数,它将是**正好**0.1.当然它不仅仅是0.1.大量的小数都有这个问题.事实是以十进制(0.1 == 0.1)将**始终为真**.在浮点数中,它可能是也可能不是真的,因为实际的二进制值可能不是精确的0.1. (3认同)
  • @Thecrocodilehunter:万一你不相信我,[这里是一些示例代码,显示"0.1 == 0.1`"](http://ideone.com/P5Mdh). (3认同)
  • 这应该被标记为正确的答案.Jon Skeet的答案有点令人困惑...... (3认同)
  • 几乎每次浮点表示的精度问题(无论是十进制还是二进制)出现时,都会在交叉目的上进行长时间的评论对话.从根本上说,这是由于浮点*表示*表示*的*exact*value*是否对应于现实世界中相同的*exact*值的问题.通过查看数字本身的表示,无法知道这一点; 它只能由使用该表示的人知道. (3认同)
  • 精度不是主要区别.十进制为基数10是主要区别. (3认同)
  • -1而float和double之间的主要区别是精度,float,double和decimal之间的主要区别不是.小数确实具有更宽的精度,但更重要的是,它还以十进制为中心的格式存储值,而不是float和double,它们以二进制为中心的格式存储它们的值.举一个例子,十进制数字".75"相当于二进制的".11",因为一半加一,= =四分之四.当然,一些小数十进制值(即使在~7位数范围内)也只能用double和float近似. (3认同)
  • @ChibuezeOpata:乔恩·斯基特的答案可能有点令人困惑,但它具有无限的准确性...... (2认同)

Mar*_*nes 78

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

  • 由于物理问题或人工测量的实际限制,在许多科学计算中可以接受一定的精度损失.金融业不接受精度损失.
  • 对于大多数操作,十进制比浮动(和多)慢很多(主要是因为浮点运算以二进制完成),而十进制填充在基数10中完成(即浮点数和双精度由FPU硬件处理,例如MMX/SSE ,而小数是用软件计算的).
  • 尽管它支持更多的精度数字,但Decimal的值范围比double小得多.因此,Decimal不能用于表示许多科学价值.

  • 如果您正在进行财务计算,您绝对必须滚动自己的数据类型或找到符合您确切需求的好库.金融环境中的准确性由(人类)标准机构定义,并且它们具有关于如何进行计算的非常具体的本地化(在时间和地理上)规则.在.Net中的简单数值数据类型中没有捕获正确舍入等内容.进行计算的能力只是这个难题的一小部分. (4认同)

小智 73

+---------+----------------+---------+----------+---------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                             |
| Type    | (System) type  |         | Occupied |                                             |
+---------+----------------+---------+----------+---------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                 |
| short   | System.Int16   | Yes     | 2        | -32768 to 32767                             |
| int     | System.Int32   | Yes     | 4        | -2147483648 to 2147483647                   |
| long    | System.Int64   | Yes     | 8        | -9223372036854775808 to 9223372036854775807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                    |
| ushort  | System.Uint16  | No      | 2        | 0 to 65535                                  |
| uint    | System.UInt32  | No      | 4        | 0 to 4294967295                             |
| ulong   | System.Uint64  | No      | 8        | 0 to 18446744073709551615                   |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5 x 10-45 to ±3.4 x 1038   |
|         |                |         |          |  with 7 significant figures                 |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0 x 10-324 to ±1.7 x 10308 |
|         |                |         |          |  with 15 or 16 significant figures          |
| decimal | System.Decimal | Yes     | 12       | Approximately ±1.0 x 10-28 to ±7.9 x 1028   |
|         |                |         |          |  with 28 or 29 significant figures          |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)              |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                               |
+---------+----------------+---------+----------+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅:http:
//social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/921a8ffc-9829-4145-bdc9-a96c1ec174a5

  • 您遗漏了最大的差异,即用于十进制类型的基数(十进制存储为基数10,列出的所有其他数字类型都是基数2). (3认同)
  • 十进制是 128 位......意味着它占用 16 字节而不是 12 (3认同)
  • 上图或源论坛帖子中未正确描述 Single 和 Double 的值范围。由于我们无法轻松地在此处为文本添加上标,因此请使用脱字符号:Single 应为 10^-45 和 10^38,Double 应为 10^-324 和 10^308。此外,MSDN 的浮点数范围为 -3.4x10^38 到 +3.4x10^38。如果链接发生更改,请在 MSDN 中搜索 System.Single 和 System.Double。单:https://msdn.microsoft.com/en-us/library/b1e65aza.aspx 双:https://msdn.microsoft.com/en-us/library/678hzkk9.aspx (2认同)

Cha*_*thJ 46

float 7位精度

double 有大约15位数的精度

decimal 有大约28位数的精度

如果您需要更高的准确度,请使用double而不是float.在现代CPU中,两种数据类型具有几乎相同的性能.使用浮动的唯一好处是它们占用的空间更少.只有你有很多这样的事情才真正重要.

我发现这很有趣.每个计算机科学家应该知道的浮点运算

  • @supercat double在会计应用程序中永远不会*正确.因为Double只能近似十进制值(即使在它自己的精度范围内).这是因为double将值存储为base-2(二进制)中心格式. (6认同)
  • @BrainSlugs83:使用浮点类型来保存*非整数*数量是不合适的,但是历史上很常见的是,语言的浮点类型可以精确地表示比整数类型更大的整数值可以代表.也许最极端的例子是Turbo-87,其唯一的整数类型被限制在-32768到+32767,但其"Real"可以IIRC表示单位精度高达1.8E + 19的值.我认为会计应用程序使用"Real"代表整数个便士而不是... (2认同)

tom*_*ius 43

我不会重复已经在其他答案和评论中回答的大量好的(和一些坏的)信息,但我会用一个提示回答你的后续问题:

什么时候会有人使用其中一种?

数值使用十进制

使用float/double作为测量

一些例子:

  • 钱(我们数钱还是衡量钱?)

  • 距离(我们计算距离还是测量距离?*)

  • 得分(我们计算分数还是衡量分数?)

我们总是数钱,不应该衡量它.我们通常测量距离.我们经常算得分.

*在某些情况下,我称之为名义距离,我们可能确实想要"计算"距离.例如,也许我们正在处理显示城市距离的国家标志,我们知道那些距离永远不会超过一个十进制数字(xxx.x km).

  • 我真的很喜欢这个答案,尤其是“我们算钱还是衡量钱?”这个问题。但是,除了金钱之外,我想不出任何不只是整数的“计数”。我见过一些使用十进制的应用程序,只是因为 double 的有效数字 *太少 *。换句话说,可能会使用十进制,因为 C# 没有 **quadruple** 类型 https://en.wikipedia.org/wiki/Quadruple-precision_floating-point_format (2认同)

Gor*_*ulu 35

没有人提到这一点

在默认设置中,Floats(System.Single)和double(System.Double)将永远不会使用溢出检查,而Decimal(System.Decimal)将始终使用溢出检查.

我的意思是

decimal myNumber = decimal.MaxValue;
myNumber += 1;
Run Code Online (Sandbox Code Playgroud)

抛出OverflowException.

但这些不是:

float myNumber = float.MaxValue;
myNumber += 1;
Run Code Online (Sandbox Code Playgroud)

&

double myNumber = double.MaxValue;
myNumber += 1;
Run Code Online (Sandbox Code Playgroud)

  • `float.MaxValue+1 == float.MaxValue`,就像`decimal.MaxValue+0.1D ==decimal.MaxValue`。也许你的意思是像`float.MaxValue*2`? (2认同)

小智 29

如前所述,整数是整数.他们无法存储点数,例如.7,.42和.007.如果您需要存储非整数的数字,则需要使用不同类型的变量.您可以使用double类型或float类型.您可以以完全相同的方式设置这些类型的变量:int您可以键入double或键入,而不是使用该单词float.像这样:

float myFloat;
double myDouble;
Run Code Online (Sandbox Code Playgroud)

(float是"浮点数"的缩写,只是表示最后有点的数字.)

两者之间的差异在于它们可以容纳的数字的大小.对于float,您的号码最多可以包含7位数字.对于doubles,您最多可以有16位数字.更确切地说,这是官方规模:

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308
Run Code Online (Sandbox Code Playgroud)

float是一个32位数字,double是一个64位数字.

双击新按钮以获取代码.将以下三行添加到按钮代码中:

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());
Run Code Online (Sandbox Code Playgroud)

暂停程序并返回编码窗口.改变这一行:

myDouble = 0.007;
myDouble = 12345678.1234567;
Run Code Online (Sandbox Code Playgroud)

运行程序并单击双击按钮.消息框正确显示数字.但是,最后添加另一个数字,C#将再次向上或向下舍入.道德是如果你想要准确,小心四舍五入!

  • 在您的示例中赞成使用.42和.007.:D (6认同)
  • 您提到的“点某物”通常称为数字的“小数部分”。“浮点数”并不意味着“以点数结尾的数字”;而是“浮点”区分数字的类型,而不是“定点”数字(也可以存储小数值);区别在于精度是固定的还是浮动的。-- 浮点数以精度为代价为您提供更大的动态值范围(最小值和最大值),而定点数以范围为代价为您提供恒定的精度。 (3认同)

xpo*_*ort 28

  1. Double和float可以除以整数零,在编译和运行时都没有异常.
  2. 十进制不能除以整数零.如果您这样做,编译将始终失败.

  • 他们肯定可以!它们还有一些"神奇"值,如无穷大,负无穷大和NaN(不是数字),这使得它在计算斜率时非常有用于检测垂直线......此外,如果你需要在调用浮点数之间做出决定.TryParse,double.TryParse和decimal.TryParse(例如,检测字符串是否为数字),我建议使用double或float,因为它们将正确解析"Infinity"," - Infinity"和"NaN" ,而十进制则不会. (6认同)
  • 仅当您尝试将文字“小数”除以零 (CS0020) 时,_Compilation_ 才会失败,整数文字也是如此。但是,如果运行时十进制值除以零,您将得到异常而不是编译错误。 (2认同)

Muk*_*mar 16

  • float: ±1.5 x 10^-45 to ±3.4 x 10^38 (~7 significant figures
  • double: ±5.0 x 10^-324 to ±1.7 x 10^308 (15-16 significant figures)
  • decimal: ±1.0 x 10^-28 to ±7.9 x 10^28 (28-29 significant figures)

  • 差异不仅仅是精确度. - `decimal`实际上以十进制格式存储(与base 2相反;因此,由于两个数字系统之间的转换,它不会丢失或舍入数字); 另外,`decimal`没有特殊值的概念,如NaN,-0,∞或-∞. (8认同)

Mik*_*ill 13

这对我来说是一个有趣的线索,因为今天,我们刚刚遇到了一个令人讨厌的小虫子,decimal因为它的精确度低于一个float.

在我们的C#代码中,我们从Excel电子表格中读取数值,将它们转换为a 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);
}
Run Code Online (Sandbox Code Playgroud)

现在,对于我们几乎所有的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;
    …
}
Run Code Online (Sandbox Code Playgroud)

尽管double精度低于a decimal,但实际上确保了小数字仍然可以识别.出于某种原因,double.TryParse实际上能够检索这么小的数字,而decimal.TryParse将它们设置为零.

奇.很奇怪.

  • -1不要误解我的意思,如果这是真的,那很有意思,但这是一个单独的问题,它肯定不是这个问题的答案. (11认同)
  • 出于好奇,cellValue.ToString()的原始值是多少?Decimal.TryParse("0.00006317592",out val)似乎有效...... (3认同)
  • 也许是因为Excel单元格返回了一个双精度值并且ToString()值为"6.31759E-05"因此decimal.Parse()不喜欢这种表示法.我打赌,如果你检查了Decimal.TryParse()的返回值,它将是假的. (2认同)
  • @weston答案通常填补他们错过的细微差别来补充其他答案.这个答案强调了解析方面的差异.这是问题的答案! (2认同)
  • 呃... `decimal.Parse("0.00006317592")` 有效——你还有别的事情要做。-- 可能是科学记数法? (2认同)
  • `decimal.Parse("0.00006317592") 有效,但 `decimal.Parse(0.00006317592.ToString())` 并不像 @SergioL 建议的那样。`0.00006317592.ToString()` 变成了 `6.317592E-05` 而decimal.Parse 不喜欢这样。 (2认同)

yoy*_*oyo 8

对于内存和性能都很关键的游戏和嵌入式系统等应用程序,float通常是数字类型,因为它更快,是double的一半大小.整数曾经是首选武器,但浮点性能在现代处理器中已超过整数.十进制就出来了!

  • 几乎所有现代系统,甚至手机,都具有双精度的硬件支持;如果你的游戏有简单的物理原理,你会注意到 double 和 float 之间的巨大差异。(例如,计算简单的小行星克隆中的速度/摩擦力,双倍允许加速度比浮动更流畅地流动。--看起来应该不重要,但它完全重要。) (2认同)

小智 7

Decimal,Double和Float变量类型在存储值方面有所不同.精度是主要区别,其中float是单精度(32位)浮点数据类型,double是双精度(64位)浮点数据类型,decimal是128位浮点数据类型.

浮动 - 32位(7位)

双 - 64位(15-16位)

十进制 - 128位(28-29位有效数字)

更多关于...... Decimal,Float和Double之间的区别


sch*_*ebe 5

所有这些类型的问题是某些不精确性存在并且这个问题可能发生在小的十进制数字中,如下例所示

Dim fMean as Double = 1.18
Dim fDelta as Double = 0.08
Dim fLimit as Double = 1.1

If fMean - fDelta < fLimit Then
    bLower = True
Else
    bLower = False
End If
Run Code Online (Sandbox Code Playgroud)

问题:bLower变量包含哪个值?

答:在32位机器上bLower包含TRUE!

如果我用Decimal替换Double,则bLower包含FALSE,这是一个很好的答案.

在double中,问题是fMean-fDelta = 1.09999999999低于1.1.

注意:我认为同样的问题肯定存在于其他数字,因为Decimal只是一个具有更高精度的双精度,并且精度始终是一个限制.

实际上,Double,Float和Decimal对应于COBOL中的BINARY十进制!

遗憾的是,在.Net中不存在COBOL中实现的其他数字类型.对于那些不了解COBOL的人,COBOL中存在数字类型

BINARY or COMP like float or double or decimal
PACKED-DECIMAL or COMP-3 (2 digit in 1 byte)
ZONED-DECIMAL (1 digit in 1 byte) 
Run Code Online (Sandbox Code Playgroud)


Gnt*_*ntS 5

简单来说:

  1. Decimal,Double和Float变量类型在存储值的方式上有所不同。
  2. 精度是主要区别(注意这不是唯一的区别),其中float是单精度(32位)浮点数据类型,double是双精度(64位)浮点数据类型,十进制是128位浮点数据类型。
  3. 汇总表:

/==========================================================================================
    Type       Bits    Have up to                   Approximate Range 
/==========================================================================================
    float      32      7 digits                     -3.4 × 10 ^ (38)   to +3.4 × 10 ^ (38)
    double     64      15-16 digits                 ±5.0 × 10 ^ (-324) to ±1.7 × 10 ^ (308)
    decimal    128     28-29 significant digits     ±7.9 x 10 ^ (28) or (1 to 10 ^ (28)
/==========================================================================================
Run Code Online (Sandbox Code Playgroud) 您可以在此处阅读更多信息FloatDoubleDecimal

  • 我强烈反对精度是主要区别。主要区别在于基数:十进制浮点数与二进制浮点数。这种差异使“Decimal”适用于金融应用程序,它是在“Decimal”和“Double”之间做出决定时使用的主要标准。例如,很少有“双”精度不足以满足科学应用的情况(并且“十进制”通常*不适合*科学应用,因为其范围有限)。 (2认同)