提问人: 提问时间:3/6/2009 最后编辑:PC Luddite 更新时间:1/21/2023 访问量:1221242
.NET 中的 decimal、float 和 double 之间的区别?
Difference between decimal, float and double in .NET?
答:
精度是主要区别。
浮点数 - 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
评论
0.1
float
0.1
0.1 + 1e-8
decimal
0.1
0.1 + 1e-29
float
0.1
的值,可以精确地表示为浮点
数。当然,使用二进制浮点数,但使用十进制浮点数也是如此。两者都不是完全精确的。0.1
0.1
0.10000001
float
0.1
0.1
(1.0 / 10) * 10 != 1.0
(1.0 / 3) * 3 != 1.0
double a = 0.1; double b = 0.1;
a == b
a
b
0.1
decimal a = 1.0m / 3.0m; decimal b = 1.0m / 3.0m;
a == b
a
b
1/3
0.3333...
decimal
float
(的 C# 别名)和(的 的 C# 别名)是浮点二进制点类型。 是 32 位; 是 64 位。换句话说,它们代表这样的数字:System.Single
double
System.Double
float
double
10001.10010110011
二进制数和二进制点的位置都在值内编码。
decimal
(的 C# 别名)是浮点小数点类型。换句话说,它们代表这样的数字:System.Decimal
12345.65789
同样,小数点的数字和位置都编码在值中——这就是使浮点类型而不是定点类型的原因。decimal
需要注意的重要一点是,人类习惯于以十进制形式表示非整数,并期望以十进制表示形式获得确切的结果;并非所有十进制数都可以用二进制浮点数(例如0.1)表示,因此,如果您使用二进制浮点值,您实际上会得到0.1的近似值。使用浮点小数点时,您仍然会得到近似值——例如,将 1 除以 3 的结果无法准确表示。
至于什么时候用什么:
对于“自然精确小数”的值,最好使用 。这通常适用于人类发明的任何概念:金融价值是最明显的例子,但也有其他例子。例如,考虑给潜水员或溜冰者的分数。
decimal
对于更多的自然人工制品,无论如何都无法真正精确测量的值,/更合适。例如,科学数据通常以这种形式表示。在这里,原始值一开始就不会是“十进制精度”,因此对于预期结果来说,保持“十进制精度”并不重要。浮点型的处理速度比小数点快得多。
float
double
评论
float
/double
通常不表示数字为 ,通常表示为 - 指数101.101110
1101010 * 2^(01010010)
float
System.Single
single
double
- Double 和 float 可以被整数零除以整数零,在编译和运行时都没有例外。
- 小数不能除以整数零。如果这样做,编译将始终失败。
评论
decimal
十进制结构严格适用于需要准确性的财务计算,这些计算相对不能容忍四舍五入。然而,小数点不足以用于科学应用,原因如下:
- 在许多科学计算中,由于被测量的物理问题或伪影的实际局限性,一定程度的精度损失是可以接受的。在金融领域,精度的损失是不可接受的。
- 对于大多数操作,十进制比浮点数和双精度运算慢得多,主要是因为浮点运算是以二进制形式完成的,而十进制运算是以 10 为基数完成的(即浮点数和双精度数由 FPU 硬件处理,例如 MMX/SSE,而小数是在软件中计算的)。
- Decimal 的值范围比 double 小得令人无法接受,尽管它支持更多的精度数字。因此,十进制不能用于表示许多科学值。
评论
float
7 位精度
double
精度约为 15 位
decimal
精度约为 28 位
如果您需要更高的准确性,请使用 double 而不是 float。 在现代 CPU 中,这两种数据类型具有几乎相同的性能。使用浮点的唯一好处是它们占用的空间更少。实际上,只有当你拥有很多它们时,才有意义。
我发现这很有趣。每个计算机科学家都应该了解的浮点运算知识
评论
double
double
Real
Real
double
double
这对我来说是一个有趣的线程,因为今天,我们刚刚遇到了一个令人讨厌的小错误,关于精度低于 .decimal
float
在我们的 C# 代码中,我们从 Excel 电子表格中读取数值,将它们转换为 ,然后将其发送回 Service 以保存到 SQL Server 数据库中。decimal
decimal
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 值转换为第一个值,然后转换为: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;
…
}
尽管精度不如 ,但这实际上确保了小数仍然能被识别。出于某种原因,双倍。TryParse
实际上能够检索如此小的数字,而 decimal。TryParse
会将它们设置为零。double
decimal
奇怪。很奇怪。
评论
decimal.Parse("0.00006317592")
如前所述,整数是整数。他们不能存储点的东西,比如 .7、.42 和 .007。如果需要存储非整数的数字,则需要不同类型的变量。可以使用 double 类型或 float 类型。您可以以完全相同的方式设置这些类型的变量:键入 或 ,而不是使用单词 。喜欢这个:int
double
float
float myFloat;
double myDouble;
(float
是“浮点数”的缩写,只表示末尾有点的数字。
两者之间的区别在于它们可以容纳的数字的大小。对于 ,您的号码中最多可以有 7 位数字。对于 s,您最多可以有 16 位数字。更准确地说,这是官方尺寸:float
double
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# 将再次向上或向下舍入。寓意是,如果你想要准确性,要小心四舍五入!
评论
+---------+----------------+---------+----------+---------------------------------------------------------+
| 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 |
+---------+----------------+---------+----------+---------------------------------------------------------+
评论
- 浮点数:±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 位有效数字)
评论
decimal
decimal
对于内存和性能都至关重要的游戏和嵌入式系统等应用,浮点通常是选择的数字类型,因为它速度更快,大小只有双精度的一半。整数曾经是首选武器,但在现代处理器中,浮点性能已经超过了整数。十进制就出来了!
评论
Decimal、Double 和 Float 变量类型在存储值的方式上有所不同。精度是主要区别,其中 float 是单精度(32 位)浮点数据类型,double 是双精度(64 位)浮点数据类型,decimal 是 128 位浮点数据类型。
浮点数 - 32 位(7 位)
双精度 - 64 位(15-16 位)
十进制 - 128 位(28-29 位有效数字)
更多关于...Decimal、Float 和 Double 之间的区别
评论
它们之间的主要区别在于精度。
float
是一个 32 位数字double
是一个 64 位数字decimal
是一个 128 位数字
没有人提到过
在默认设置中,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;
评论
float.MaxValue+1 == float.MaxValue
,就像.也许你的意思是这样的?decimal.MaxValue+0.1D == decimal.MaxValue
float.MaxValue*2
System.Decimal
我不会重申在其他答案和评论中已经回答的大量好的(和一些坏的)信息,但我会用提示来回答你的后续问题:
什么时候有人会使用其中之一?
对计数值使用十进制
使用浮点数/双精度数作为测量值
一些例子:
钱(我们是数钱还是量钱?
距离(我们是计算距离还是测量距离?
分数(我们是计算分数还是衡量分数?
我们总是数钱,永远不应该衡量它。我们通常测量距离。我们经常计算分数。
* 在某些情况下,我称之为标称距离,我们可能确实想“计算”距离。例如,也许我们正在处理显示到城市距离的国家标志,并且我们知道这些距离永远不会超过一个十进制数字 (xxx.x km)。
评论
所有这些类型的问题在于存在一定的不精确性 并且此问题可能发生在小十进制数上,如以下示例所示
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)
简单来说:
- Decimal、Double 和 Float 变量类型在存储值的方式上有所不同。
- 精度是主要区别(请注意,这不是单一区别),其中 float 是单精度(32 位)浮点数据类型,double 是双精度(64 位)浮点数据类型,decimal 是 128 位浮点数据类型。
- 汇总表:
/==========================================================================================
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)
/==========================================================================================
您可以在此处阅读更多内容,浮点数、双精度和十进制数。
评论
Decimal
Decimal
Double
Double
Decimal
在 .Net 中定义 Decimal、Float 和 Double (c#)
您必须将值提及为:
Decimal dec = 12M/6;
Double dbl = 11D/6;
float fl = 15F/6;
并检查结果。
每个占用的字节数是
Float - 4
Double - 8
Decimal - 12
评论
浮:
它是一个浮点二元点类型变量。这意味着它以二进制形式表示一个数字。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 更准确。
评论