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

Difference between decimal, float and double in .NET?

提问人: 提问时间:3/6/2009 最后编辑:PC Luddite 更新时间:1/21/2023 访问量:1221242

问:

在.NET中,和有什么区别?decimalfloatdouble

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

.NET 浮点双 十进制

评论

2赞 GibboK 3/1/2014
有趣的文章 zetcode.com/lang/csharp/datatypes
7赞 codymanix 3/6/2021
不能使用十进制与本机代码进行互操作,因为它是特定于 .net 的实现,而浮点数和双精度数可以由 CPU 直接处理。

答:

1268赞 cgreeno 3/6/2009 #1

精度是主要区别。

浮点数 - 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

评论

72赞 Erik P. 11/30/2011
@Thecrocodilehunter:对不起,没有。十进制可以表示所有可以用十进制表示法表示的数字,但不能表示 1/3。1.0m / 3.0m 将评估为 0.33333333...末尾有大量但有限的 3。将其乘以 3 不会返回精确的 1.0。
59赞 Igby Largeman 1/7/2012
@Thecrocodilehunter:我认为你混淆了准确性和精确性。在这种情况下,它们是不同的东西。精度是可用于表示数字的位数。精度越高,需要的四舍五入就越少。没有任何数据类型具有无限的精度。
18赞 Daniel Pryden 1/10/2012
@Thecrocodilehunter:你假设被测量的值是正好 - 这在现实世界中很少见!任何有限的存储格式都会将无限数量的可能值与有限数量的位模式混为一谈。例如,将混淆 和 ,而 将混淆 和 。当然,在给定的范围内,某些值可以以任何格式表示,精度损失为零(例如 可以存储任何高达 1.6e7 的整数,精度损失为零)——但这仍然不是无限的精度。0.1float0.10.1 + 1e-8decimal0.10.1 + 1e-29float
32赞 Daniel Pryden 1/11/2012
@Thecrocodilehunter:你错过了我的观点。 不是特殊值!唯一让“更好”的原因是因为人类喜欢以 10 为基数。即使有一个值,如果以相同的方式初始化两个值,它们也将是相同的值。只是这个值不会完全是 - 它将是最接近 0.1 的值,可以精确地表示为浮点数。当然,使用二进制浮点数,但使用十进制浮点数也是如此。两者都不是完全精确的。0.10.10.10000001float0.10.1(1.0 / 10) * 10 != 1.0(1.0 / 3) * 3 != 1.0
20赞 Daniel Pryden 1/11/2012
@Thecrocodilehunter:你还是不明白。我不知道如何更直截了当地说:在 C 语言中,如果你这样做,那么就是真的。仅此而已,两者将完全相等.在 C# 中,如果这样做,那么也将是真的。但是在那种情况下,两者都完全相等——它们都相等。在这两种情况下,由于表示性,都会丢失一些准确性。你固执地说有“无限”的精确度,这是错误的double a = 0.1; double b = 0.1;a == bab0.1decimal a = 1.0m / 3.0m; decimal b = 1.0m / 3.0m;a == bab1/30.3333...decimal
2566赞 Jon Skeet 3/6/2009 #2

float(的 C# 别名)和(的 的 C# 别名)是浮点二进制点类型。 是 32 位; 是 64 位。换句话说,它们代表这样的数字:System.SingledoubleSystem.Doublefloatdouble

10001.10010110011

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

decimal(的 C# 别名)是浮点小数点类型。换句话说,它们代表这样的数字:System.Decimal

12345.65789

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

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

至于什么时候用什么:

  • 对于“自然精确小数”的值,最好使用 。这通常适用于人类发明的任何概念:金融价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或溜冰者的分数。decimal

  • 对于更多的自然人工制品,无论如何都无法真正精确测量的值,/更合适。例如,科学数据通常以这种形式表示。在这里,原始值一开始就不会是“十进制精度”,因此对于预期结果来说,保持“十进制精度”并不重要。浮点型的处理速度比小数点快得多。floatdouble

评论

90赞 Mingwei Samuel 8/14/2014
float/double通常不表示数字为 ,通常表示为 - 指数101.1011101101010 * 2^(01010010)
96赞 Jon Skeet 8/14/2014
@Hazzard:这就是答案中“和二进制点的位置”部分的含义。
145赞 Brett Caswell 2/3/2015
我很惊讶它还没有被说过,它是一个 C# 别名关键字,而不是 .Net 类型。它。。 并且是浮点型二进制点类型。floatSystem.Singlesingledouble
67赞 Jon Skeet 11/26/2015
@BKSpurgeon:嗯,只有这样,你才能说一切都是二进制类型,这时它就变成了一个相当无用的定义。Decimal 是一种十进制类型,因为它是一个表示为整数 significand 和 scale 的数字,因此结果是 significand * 10^scale,而 float 和 double 是 significand * 2^scale。你取一个用十进制写成的数字,并将小数点向右移动足够远,这样你就得到了一个整数来计算有效数和小数位数。对于浮点数/双精度数,您将以二进制写入的数字开头。
38赞 David 8/29/2016
另一个区别:浮点 32 位;双 64 位;和十进制 128 位。
29赞 Display Name 7/29/2010 #3
  1. Double 和 float 可以被整数零除以整数零,在编译和运行时都没有例外。
  2. 小数不能除以整数零。如果这样做,编译将始终失败。

评论

6赞 BrainSlugs83 6/24/2011
他们当然可以!它们还具有一些“神奇”值,例如无穷大、负无穷大和 NaN(不是数字),这使得它对于在计算斜率时检测垂直线非常有用......此外,如果您需要在调用 float.TryParse,双倍。TryParse 和 decimal。TryParse(例如,为了检测字符串是否为数字),我建议使用 double 或 float,因为它们会正确解析“Infinity”、“-Infinity”和“NaN”,而 decimal 则不会。
2赞 Drew Noakes 11/18/2016
仅当尝试将文本除以零 (CS0020) 时,编译才会失败,整数文本也是如此。但是,如果运行时十进制值除以零,则将出现异常,而不是编译错误。decimal
105赞 Mark Jones 4/13/2011 #4

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

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

评论

7赞 James Moore 4/7/2016
如果你正在做财务计算,你绝对必须滚动你自己的数据类型,或者找到一个符合你确切需求的好库。金融环境中的准确性由(人类)标准机构定义,它们对如何进行计算有非常具体的本地化(时间和地理)规则。在 .Net 中的简单数值数据类型中不会捕获正确的舍入等内容。计算能力只是难题的一小部分。
58赞 CharithJ 8/29/2011 #5

float7 位精度

double精度约为 15 位

decimal精度约为 28 位

如果您需要更高的准确性,请使用 double 而不是 float。 在现代 CPU 中,这两种数据类型具有几乎相同的性能。使用浮点的唯一好处是它们占用的空间更少。实际上,只有当你拥有很多它们时,才有意义。

我发现这很有趣。每个计算机科学家都应该了解的浮点运算知识

评论

1赞 supercat 5/30/2014
@RogerLipscombe:我认为在会计应用中,在没有大于 32 位的整数类型的情况下(基本上只有那些情况),并且它被当作 53 位整数类型使用(例如,保存整数便士,或百分之一美分的整数)。如今,这些东西已经没有多大用处了,但许多语言早在获得 64 位(在某些情况下甚至是 32 位!)整数数学运算之前就已经获得了使用双精度浮点值的能力。doubledouble
1赞 saille 1/15/2015
您的答案意味着精度是这些数据类型之间的唯一区别。鉴于二进制浮点运算通常在硬件 FPU 中实现,因此性能存在显着差异。这对于某些应用程序来说可能无关紧要,但对其他应用程序至关重要。
6赞 BrainSlugs83 3/15/2015
@supercat双精度在会计应用中从来都不是合适的。因为 Double 只能近似十进制值(即使在其自身精度范围内)。这是因为 double 以以 base-2(二进制)为中心的格式存储值。
2赞 supercat 3/16/2015
@BrainSlugs83:使用浮点类型来保存非整数量是不恰当的,但从历史上看,语言的浮点类型可以精确地表示比其整数类型所能表示的更大的整数值,这是非常普遍的。也许最极端的例子是 Turbo-87,它唯一的整数类型仅限于 -32768 到 +32767,但其 IIRC 可以以单位精度表示高达 1.8E+19 的值。我认为会计应用程序用来表示整数便士比使用会计应用程序要理智得多......RealReal
1赞 supercat 3/16/2015
...让它尝试使用一堆 16 位值执行多精度数学运算。对于大多数其他语言来说,差异并没有那么极端,但很长一段时间以来,语言没有任何超过 4E9 的整数类型,但单位精度高达 9E15 的类型是很常见的。如果需要存储大于最大可用整数类型的整数,那么使用比试图捏造多精度数学更简单、更有效,特别是考虑到处理器具有执行 16x16->32 或...doubledouble
16赞 Mike Gledhill 4/16/2012 #6

这对我来说是一个有趣的线程,因为今天,我们刚刚遇到了一个令人讨厌的小错误,关于精度低于 .decimalfloat

在我们的 C# 代码中,我们从 Excel 电子表格中读取数值,将它们转换为 ,然后将其发送回 Service 以保存到 SQL Server 数据库中。decimaldecimal

Microsoft.Office.Interop.Excel.Range cell = …
object cellValue = cell.Value2;
if (cellValue != null)
{
    decimal value = 0;
    Decimal.TryParse(cellValue.ToString(), out value);
}

现在,对于我们几乎所有的 Excel 值,这都非常有效。但对于某些非常小的 Excel 值,使用十进制。TryParse 完全丢失了该值。一个这样的例子是

  • 单元格值 = 0.00006317592

  • Decimal.TryParse(cellValue.ToString(), 输出值);将返回 0

奇怪的是,解决方案是将 Excel 值转换为第一个值,然后转换为:doubledecimal

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;
    …
}

尽管精度不如 ,但这实际上确保了小数仍然能被识别。出于某种原因,双倍。TryParse 实际上能够检索如此小的数字,而 decimal。TryParse 会将它们设置为零。doubledecimal

奇怪。很奇怪。

评论

4赞 micahtan 8/28/2012
出于好奇,cellValue.ToString() 的原始值是多少?Decimal.TryParse(“0.00006317592”, out val) 似乎有效......
12赞 weston 5/22/2013
-1 不要误会我的意思,如果这是真的,这很有趣,但这是一个单独的问题,它肯定不是这个问题的答案。
5赞 SergioL 10/16/2014
可能是因为 Excel 单元格返回双精度值,而 ToString() 值为“6.31759E-05”,因此是小数。Parse() 不喜欢这个符号。我敢打赌,如果您检查 Decimal.TryParse() 的返回值,它将是 false。
3赞 Robino 5/20/2015
@weston 答案通常通过填写他们遗漏的细微差别来补充其他答案。这个答案突出了解析方面的差异。这在很大程度上是对这个问题的回答!
3赞 BrainSlugs83 9/16/2017
的。。。 工作 -- 你有别的事情要做。-- 可能是科学记数法?decimal.Parse("0.00006317592")
31赞 daniel 5/22/2012 #7

如前所述,整数是整数。他们不能存储点的东西,比如 .7、.42 和 .007。如果需要存储非整数的数字,则需要不同类型的变量。可以使用 double 类型或 float 类型。您可以以完全相同的方式设置这些类型的变量:键入 或 ,而不是使用单词 。喜欢这个:intdoublefloat

float myFloat;
double myDouble;

(float是“浮点数”的缩写,只表示末尾有点的数字。

两者之间的区别在于它们可以容纳的数字的大小。对于 ,您的号码中最多可以有 7 位数字。对于 s,您最多可以有 16 位数字。更准确地说,这是官方尺寸:floatdouble

float:  1.5 × 10^-45  to 3.4 × 10^38  
double: 5.0 × 10^-324 to 1.7 × 10^308

float是 32 位数字,并且是 64 位数字。double

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

double myDouble;
myDouble = 0.007;
MessageBox.Show(myDouble.ToString());

停止程序并返回到编码窗口。更改此行:

myDouble = 0.007;
myDouble = 12345678.1234567;

运行您的程序并单击您的双按钮。消息框正确显示数字。不过,在末尾添加另一个数字,C# 将再次向上或向下舍入。寓意是,如果你想要准确性,要小心四舍五入!

评论

4赞 BrainSlugs83 9/16/2017
你提到的“点某物”通常被称为数字的“小数部分”。“浮点数”并不意味着“一个数字,一个点在末尾的东西”;但相反,“浮点数”区分数字的类型,而不是“定点”数(也可以存储小数值);区别在于精度是固定的,还是浮动的。-- 浮点数为您提供更大的动态值范围(最小值和最大值),但以牺牲精度为代价,而定点数以牺牲范围为代价为您提供恒定的精度。
126赞 user2389722 6/7/2013 #8
+---------+----------------+---------+----------+---------------------------------------------------------+
| C#      | .Net Framework | Signed? | Bytes    | Possible Values                                         |
| Type    | (System) type  |         | Occupied |                                                         |
+---------+----------------+---------+----------+---------------------------------------------------------+
| sbyte   | System.Sbyte   | Yes     | 1        | -128 to 127                                             |
| short   | System.Int16   | Yes     | 2        | -32,768 to 32,767                                       |
| int     | System.Int32   | Yes     | 4        | -2,147,483,648 to 2,147,483,647                         |
| long    | System.Int64   | Yes     | 8        | -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| byte    | System.Byte    | No      | 1        | 0 to 255                                                |
| ushort  | System.Uint16  | No      | 2        | 0 to 65,535                                             |
| uint    | System.UInt32  | No      | 4        | 0 to 4,294,967,295                                      |
| ulong   | System.Uint64  | No      | 8        | 0 to 18,446,744,073,709,551,615                         |
| float   | System.Single  | Yes     | 4        | Approximately ±1.5e-45 to ±3.4e38                       |
|         |                |         |          |  with ~6-9 significant figures                          |
| double  | System.Double  | Yes     | 8        | Approximately ±5.0e-324 to ±1.7e308                     |
|         |                |         |          |  with ~15-17 significant figures                        |
| decimal | System.Decimal | Yes     | 16       | Approximately ±1.0e-28 to ±7.9e28                       |
|         |                |         |          |  with 28-29 significant figures                         |
| char    | System.Char    | N/A     | 2        | Any Unicode character (16 bit)                          |
| bool    | System.Boolean | N/A     | 1 / 2    | true or false                                           |
+---------+----------------+---------+----------+---------------------------------------------------------+

有关详细信息,请参阅此处

评论

12赞 BrainSlugs83 3/15/2015
您遗漏了最大的区别,即用于十进制类型的基数(十进制存储为基数 10,列出的所有其他数值类型均以 2 为基数)。
2赞 deegee 6/23/2015
Single 和 Double 的值范围在上图或源论坛帖子中未正确描述。由于我们不能轻易地将文本添加到此处,因此请使用插入符号字符:Single 应为 10^-45 和 10^38,Double 应为 10^-324 和 10^308。此外,MSDN 还具有范围为 -3.4x10^38 到 +3.4x10^38 的浮点数。在 MSDN 中搜索 System.Single 和 System.Double,以防链接发生更改。单人:msdn.microsoft.com/en-us/library/b1e65aza.aspx 双人:msdn.microsoft.com/en-us/library/678hzkk9.aspx
3赞 user1477332 10/23/2018
十进制是 128 位......表示它占用 16 个字节而不是 12 个字节
19赞 Mukesh Kumar 1/2/2014 #9
  • 浮点数:±1.5 x 10^-45 至 ±3.4 x 10^38(~7 个有效数字)
  • 双精度:±5.0 x 10^-324 至 ±1.7 x 10^308(15-16 个有效数字)
  • 十进制:±1.0 x 10^-28 至 ±7.9 x 10^28(28-29 位有效数字)

评论

11赞 BrainSlugs83 9/16/2017
区别不仅仅是精度。-- 实际上以十进制格式存储(与以 2 为基数相反;因此它不会由于两个数字系统之间的转换而丢失或整数);此外,没有特殊值的概念,例如 NaN、-0、∞ 或 -∞。decimaldecimal
9赞 yoyo 5/17/2014 #10

对于内存和性能都至关重要的游戏和嵌入式系统等应用,浮点通常是选择的数字类型,因为它速度更快,大小只有双精度的一半。整数曾经是首选武器,但在现代处理器中,浮点性能已经超过了整数。十进制就出来了!

评论

2赞 BrainSlugs83 9/16/2017
几乎所有现代系统,甚至手机,都有双倍的硬件支持;如果你的游戏有简单的物理特性,你会注意到双倍和浮点之间有很大的区别。(例如,在一个简单的小行星克隆中计算速度/摩擦力,双倍允许加速度比浮动更流畅地流动。
0赞 yoyo 9/23/2017
双精度大小也是浮点数的两倍,这意味着您需要处理两倍的数据,这会损害您的缓存性能。与往常一样,测量并相应地进行。
15赞 warnerl 9/30/2014 #11

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

浮点数 - 32 位(7 位)

双精度 - 64 位(15-16 位)

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

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

评论

0赞 Andrea Leganza 2/4/2021
有人知道为什么每种类型都有这些不同的数字范围吗?
2赞 user3776645 12/22/2014 #12

它们之间的主要区别在于精度。

  • float是一个 32 位数字
  • double是一个 64 位数字
  • decimal是一个 128 位数字
48赞 GorkemHalulu 1/2/2015 #13

没有人提到过

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

我的意思是

decimal myNumber = decimal.MaxValue;
myNumber += 1;

引发 OverflowException

但这些不是:

float myNumber = float.MaxValue;
myNumber += 1;

&

double myNumber = double.MaxValue;
myNumber += 1;

评论

2赞 supercat 1/14/2015
float.MaxValue+1 == float.MaxValue,就像.也许你的意思是这样的?decimal.MaxValue+0.1D == decimal.MaxValuefloat.MaxValue*2
0赞 GorkemHalulu 1/14/2015
@supercar 但小数点不是真的。MaxValue + 1 == 十进制。最大值
0赞 GorkemHalulu 1/14/2015
@supercar小数。MaxValue + 0.1m == 十进制。MaxValue 正常
1赞 supercat 1/15/2015
在无法区分整个单位之前会抛出异常,但如果应用程序应该处理例如美元和美分,则可能为时已晚。System.Decimal
94赞 tomosius 4/22/2016 #14

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

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

计数值使用十进制

使用浮点数/双精度数作为测量

一些例子:

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

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

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

我们总是数钱,永远不应该衡量它。我们通常测量距离。我们经常计算分数。

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

评论

4赞 John Henckel 4/5/2019
我真的很喜欢这个答案,尤其是“我们是数钱还是量钱?然而,除了钱,我想不出任何不是简单的整数的“计数”的东西。我见过一些使用十进制的应用程序,仅仅是因为 double 的有效数字太少。换句话说,可以使用十进制,因为 C# 没有四元 en.wikipedia.org/wiki/Quadruple-precision_floating-point_format
5赞 schlebe 2/23/2017 #15

所有这些类型的问题在于存在一定的不精确性 并且此问题可能发生在小十进制数上,如以下示例所示

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

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

答:在 32 位计算机上,bLower 包含 TRUE !!

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

在双精度中,问题是 fMean-fDelta = 1.09999999999,低于 1.1。

注意:我认为其他数字肯定存在同样的问题,因为 Decimal 只是精度更高的双精度,并且精度总是有限制的。

事实上,Double、Float 和 Decimal 对应于 COBOL 中的 BINARY decimal!

遗憾的是,在 COBOL 中实现的其他数值类型在 .NET 中不存在。对于那些不了解 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) 
4赞 IndustProg 2/10/2018 #16

简单来说:

  1. Decimal、Double 和 Float 变量类型在存储值的方式上有所不同。
  2. 精度是主要区别(请注意,这不是单一区别),其中 float 是单精度(32 位)浮点数据类型,double 是双精度(64 位)浮点数据类型,decimal 是 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)
/==========================================================================================
您可以在此处阅读更多内容,浮点数、双精度十进制数。

评论

1赞 Mark Dickinson 2/10/2018
这个答案增加了哪些现有答案中没有涵盖的内容?顺便说一句,您在“小数”行中的“或”是不正确的:您从中复制的网页中的斜杠表示除法而不是替代项。
2赞 Mark Dickinson 2/10/2018
我强烈反对精确度是主要区别。主要区别在于基数:十进制浮点与二进制浮点。这种差异使它适合金融应用,并且是在 和 之间做出决定时使用的主要标准。例如,对于科学应用来说,精度不足以满足科学应用的情况很少见(并且由于其范围有限,通常不适合科学应用)。DecimalDecimalDoubleDoubleDecimal
-3赞 Purnima Bhatia 1/17/2020 #17

在 .Net 中定义 Decimal、Float 和 Double (c#)

您必须将值提及为:

Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;

并检查结果。

每个占用的字节数是

Float - 4
Double - 8
Decimal - 12

评论

0赞 Reid Moffat 5/5/2022
问题是询问每个人的区别和优缺点
2赞 Abbas Aryanpour 1/5/2023 #18

浮:

它是一个浮点二元点类型变量。这意味着它以二进制形式表示一个数字。Float 是单精度数据类型。它主要用于图形库,因为对处理能力的要求非常高,也用于舍入误差不是很重要的情况。32 bits(6-9 significant figures)

双:

它也是一个具有双精度和 的浮点二元点类型变量。Double 可能是实际值最常用的数据类型,但金融应用和需要高精度的地方除外。64 bits size(15-17 significant figures)

十进制:

它是一个浮点小数点类型变量。这意味着它使用十进制数表示一个数字。它用于存储和表示数据。因此,它比浮点和双精度更高。它们主要用于金融应用,因为它们精度高且易于避免舍入误差。(0-9)128 bits(28-29 significant figures)

例:

using System;
  
public class GFG {
  
    static public void Main()
    {
  
        double d = 0.42e2;    //double data type
        Console.WriteLine(d); // output 42
  
        float f = 134.45E-2f;  //float data type
        Console.WriteLine(f); // output: 1.3445
  
        decimal m = 1.5E6m;   //decimal data type
        Console.WriteLine(m); // output: 1500000
    }
}

浮点数、双精度数和小数数之间的比较基于:

不。使用的位数:

  • Float 使用 32 位来表示数据。
  • Double 使用 64 位来表示数据。
  • Decimal 使用 128 位来表示数据。

取值范围:

  • 浮点值的范围大约从 ±1.5e-45 到 ±3.4e38。

  • 双精度值的范围约为 ±5.0e-324 到 ±1.7e308。

  • 十进制值的范围约为 ±1.0e-28 到 ±7.9e28。

精度:

  • 浮点数表示具有单精度的数据。
  • Double 表示具有双精度的数据。
  • Decimal 比 float 和 Double 具有更高的精度。

准确性:

  • Float 不如 Double 和 Decimal 准确。
  • Double 比 Float 更准确,但不如 Decimal 准确。
  • Decimal 比 Float 和 Double 更准确。