ZetCode

C# double

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何在 C# 中使用 double 数据类型。

double 类型是编程中的基本数据类型之一。 我们可以将数据类型定义为一组值,以及对这些值允许的操作。

double 是一种原始数据类型,它表示计算中的实数。 doubleSystem.Double 结构的别名。

浮点数表示计算机中的实数。实数测量连续的量,如重量、高度或速度。在 C# 中,我们有三种浮点类型:floatdoubledecimal

C# 别名 .NET 类型 大小 精度 范围
float System.Single 4 字节 7 位数字 +-1.5 x 10-45 到 +-3.4 x 1038
double System.Double 8 字节 15-16 位数字 +-5.0 x 10-324 到 +-1.7 x 10308
decimal System.Decimal 16 字节 28-29 位小数 +-1.0 x 10-28 到 +-7.9 x 1028

上表给出了浮点类型的特征。

C# double 类型常量

double 类型有一些内置常量。

Program.cs
Console.WriteLine(double.MinValue);
Console.WriteLine(double.MaxValue);

Console.WriteLine(double.E);
Console.WriteLine(double.Pi);
Console.WriteLine(double.Tau);

该程序打印五个常量。

Console.WriteLine(double.MinValue);
Console.WriteLine(double.MaxValue);

我们打印 double 类型的最小和最大可能值。

Console.WriteLine(double.E);
Console.WriteLine(double.Pi);
Console.WriteLine(double.Tau);

我们打印三个众所周知的数学常量。

$ dotnet run
-1.7976931348623157E+308
1.7976931348623157E+308
2.718281828459045
3.141592653589793
6.283185307179586

浮点类型后缀

默认情况下,实数在 C# 程序中是 double 类型。 要使用不同的类型,我们必须使用后缀。 F/f 用于 float 数字,M/m 用于 decimal 数字。

Program.cs
float n1 = 6.78f;
double n2 = 6.78;
decimal n3 = 6.78m;

Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine(n3);

Console.WriteLine(n1.GetType());
Console.WriteLine(n2.GetType());
Console.WriteLine(n3.GetType());

在上面的程序中,我们使用了三种不同的字面量表示法来表示浮点数。

float n1 = 1.234f;

f 后缀用于 float 数字。

double n2 = 1.234;

如果我们不使用后缀,那么它就是一个 double 数字。 我们可以选择使用 d 后缀。

Console.WriteLine(n1.GetType());

GetType 方法返回数字的类型。

$ dotnet run
6.78
6.78
6.78
System.Single
System.Double
System.Decimal

C# 转换为 double

在下一个示例中,我们将展示如何将值转换为 double 类型。

Program.cs
float n1 = 6.78f;
decimal n2 = 6.78m;
int n3 = 7;

Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine(n3);

Console.WriteLine("-------------------");

double d1 = (double) n1;
double d2 = decimal.ToDouble(n2);
double d3 = Convert.ToDouble(n3);

Console.WriteLine(d1);
Console.WriteLine(d2);
Console.WriteLine(d3);

Console.WriteLine("-------------------");

Console.WriteLine(d1.GetType());
Console.WriteLine(d2.GetType());
Console.WriteLine(d3.GetType());

我们定义三个具有 floatdecimalint 类型的变量。 我们将这些值转换为 double 类型。

float n1 = 6.78f;
decimal n2 = 6.78m;
int n3 = 7;

我们定义三个变量。

double d1 = (double) n1;

我们使用强制转换操作将 float 值转换为 double

double d2 = decimal.ToDouble(n2);

在第二种情况下,我们使用 decimal.ToDouble 内置方法将 decimal 转换为 double

double d3 = Convert.ToDouble(n3);

最后,对于整数类型,我们使用外部 Convert 类。

$ dotnet run
6.78
6.78
7
-------------------
6.78000020980835
6.78
7
-------------------
System.Double
System.Double
System.Double

请注意,第一次转换中存在一些小错误。

C# 从 double 类型转换

在下一个示例中,我们将展示如何从 double 类型转换为其他数据类型。

Program.cs
double val = 6.78;

float n1 = (float) val;
decimal n2 = Convert.ToDecimal(val);
int n3  = Convert.ToInt32(val);

Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine(n3);

Console.WriteLine(n1.GetType());
Console.WriteLine(n2.GetType());
Console.WriteLine(n3.GetType());

我们定义一个 double 值。 我们将该值转换为 floatdecimalint

$ dotnet run
6.78
6.78
7
System.Single
System.Decimal
System.Int32

double 类型不精确

double 类型不精确。 计算中存在小的舍入误差。 在许多情况下,这些不会构成问题。 例如,如果一个项目是 1.78 毫米还是 1.7801 毫米日志,则无关紧要。

在财务和货币计算中,这些小错误很重要。 对于这些类型的计算,我们使用 decimal 类型。

Program.cs
double n1 = 0.1 + 0.1 + 0.1;
double n2 = 0.3;

Console.WriteLine(n1);
Console.WriteLine(n2);

if (n1 == n2)
{
    Console.WriteLine("The values are equal");
} else 
{
    Console.WriteLine("The values are not equal");
}

该程序演示了使用 double 类型进行简单计算时的一个小错误。

$ dotnet run
0.30000000000000004
0.3
The values are not equal

这两个值不相等,因为加法运算中存在一个很小的错误。

C# 对 double 值进行四舍五入

舍入数字是向上或向下调整数字以使计算更容易。 我们可以四舍五入

double double.Round(double x, int digits, MidpointRounding mode)

该方法使用指定的舍入模式将 double 值舍入到指定数量的小数位。

模式描述
AwayFromZero向远离零的最近数字舍入
ToEven向最近的偶数舍入
ToNegativeInfinity向下舍入
ToPositiveInfinity向上舍入
ToZero向零舍入

该表显示了可用的舍入模式。

Program.cs
double n1 = 1 / 7d;
double n2 = -1 / 7d;

Console.WriteLine(n1);
Console.WriteLine(n2);

Console.WriteLine("-------------------------");

Console.WriteLine(double.Round(n1, 3, MidpointRounding.ToEven));
Console.WriteLine(double.Round(n2, 3, MidpointRounding.ToEven));

Console.WriteLine("-------------------------");

Console.WriteLine(double.Round(n1, 3, MidpointRounding.AwayFromZero));
Console.WriteLine(double.Round(n2, 3, MidpointRounding.AwayFromZero));

Console.WriteLine("-------------------------");

Console.WriteLine(double.Round(n1, 3, MidpointRounding.ToZero));
Console.WriteLine(double.Round(n2, 3, MidpointRounding.ToZero));

Console.WriteLine("-------------------------");

Console.WriteLine(double.Round(n1, 3, MidpointRounding.ToNegativeInfinity));
Console.WriteLine(double.Round(n2, 3, MidpointRounding.ToNegativeInfinity));

Console.WriteLine("-------------------------");

Console.WriteLine(double.Round(n1, 3, MidpointRounding.ToPositiveInfinity));
Console.WriteLine(double.Round(n2, 3, MidpointRounding.ToPositiveInfinity));

在该示例中,我们有一个正的和一个负的 double 值。 我们使用可用的舍入模式将这些值舍入到三位小数。

$ dotnet run 
0.14285714285714285
-0.14285714285714285
-------------------------
0.143
-0.143
-------------------------
0.143
-0.143
-------------------------
0.142
-0.142
-------------------------
0.142
-0.143
-------------------------
0.143
-0.142

来源

Double 结构

在本文中,我们使用了 C# 语言中的 double 类型。

作者

我的名字是 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程