C# 取整
最后修改日期:2025 年 4 月 23 日
本教程演示了如何在 C# 中使用各种方法和技巧对数字进行取整。
数字取整涉及向上或向下调整数字,以简化计算并提高数值结果的可读性。
C# 取整方法
可以使用 Ceiling 和 Floor 方法执行基本的取整操作。 Ceiling 方法返回大于或等于输入数字的最小整数,而 Floor 方法返回小于或等于输入数字的最大整数。
对于更复杂的取整,Round 方法提供了更大的控制权。 存在多个重载的 Round 方法,包括 Math.Round、float.Round、double.Round 和 decimal.Round,每个方法都针对特定的数值类型和取整需求量身定制。
Math.Round(decimal d, int decimals, MidpointRounding mode)
此重载方法将十进制值取整到指定的小数位数,并使用指定的取整模式进行精确控制。
| 模式 | 描述 |
|---|---|
| AwayFromZero | 向远离零的最近的数字取整 |
| ToEven | 向最近的偶数取整 |
| ToNegativeInfinity | 向下取整 |
| ToPositiveInfinity | 向上取整 |
| ToZero | 向零取整 |
该表概述了可用于微调数字调整的可用取整模式。
C# Ceiling & Floor
此示例演示了如何使用 Ceiling 和 Floor 方法对 double 值进行取整。
double n1 = 1.467; Console.WriteLine(Math.Ceiling(n1)); Console.WriteLine(Math.Floor(n1)); Console.WriteLine(Math.Ceiling(-n1)); Console.WriteLine(Math.Floor(-n1)); double n3 = 6.967; Console.WriteLine(double.Ceiling(n3)); Console.WriteLine(double.Floor(n3)); Console.WriteLine(double.Ceiling(-n3)); Console.WriteLine(double.Floor(-n3));
该程序对两个 double 值进行取整,为正数和负数生成整数输出。
Console.WriteLine(Math.Ceiling(n1)); Console.WriteLine(Math.Floor(n1));
这些方法通过 Math 类访问以进行标准取整操作。
Console.WriteLine(double.Ceiling(n3)); Console.WriteLine(double.Floor(n3));
或者,double 类型提供自己的 Ceiling 和 Floor 方法。
$ dotnet run 2 1 -1 -2 7 6 -6 -7
C# 取整到指定小数位数
您可以指定要将数字四舍五入到的小数位数,从而精确控制输出。
float n1 = 1.23487f;
float n2 = 3.97451f;
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4));
Console.WriteLine(Math.Round(n2, 4));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 3));
Console.WriteLine(Math.Round(n2, 3));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 2));
Console.WriteLine(Math.Round(n2, 2));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 1));
Console.WriteLine(Math.Round(n2, 1));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 0));
Console.WriteLine(Math.Round(n2, 0));
该程序使用 Math.Round 将两个 float 值取整到四位、三位、两位、一位和零位小数,展示了精度控制。
$ dotnet run 1.23487 3.97451 ------------------------- 1.2349 3.9745 ------------------------- 1.235 3.975 ------------------------- 1.23 3.97 ------------------------- 1.2 4 ------------------------- 1 4
C# 取整模式
此示例探讨了 C# 中可用于细微数字调整的各种取整模式。
double n1 = 1/7d;
double n2 = -1/7d;
Console.WriteLine(n1);
Console.WriteLine(n2);
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4, MidpointRounding.ToEven));
Console.WriteLine(Math.Round(n2, 4, MidpointRounding.ToEven));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4, MidpointRounding.AwayFromZero));
Console.WriteLine(Math.Round(n2, 4, MidpointRounding.AwayFromZero));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4, MidpointRounding.ToZero));
Console.WriteLine(Math.Round(n2, 4, MidpointRounding.ToZero));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4, MidpointRounding.ToNegativeInfinity));
Console.WriteLine(Math.Round(n2, 4, MidpointRounding.ToNegativeInfinity));
Console.WriteLine("-------------------------");
Console.WriteLine(Math.Round(n1, 4, MidpointRounding.ToPositiveInfinity));
Console.WriteLine(Math.Round(n2, 4, MidpointRounding.ToPositiveInfinity));
该程序使用每种可用的取整模式将正数和负数 double 值取整到四位小数,突出显示了它们的不同行为。
$ dotnet run 0.14285714285714285 -0.14285714285714285 ------------------------- 0.1429 -0.1429 ------------------------- 0.1429 -0.1429 ------------------------- 0.1428 -0.1428 ------------------------- 0.1428 -0.1429 ------------------------- 0.1429 -0.1428
C# 取整示例
此示例跨各种模式和精度级别对十进制数进行取整,并在格式化的表格中显示结果。
using System.Text;
decimal n = 1 / 7m;
// decimal n = -1/7m;
char s = ' ';
string cln = new string('-', 10);
string h1 = "(1)";
string h2 = "(2)";
string h3 = "(3)";
string h4 = "(4)";
string h5 = "(5)";
var precisions = new List { 1, 2, 3, 4, 5 };
var modes = new List
{
MidpointRounding.ToEven, MidpointRounding.ToZero,
MidpointRounding.AwayFromZero, MidpointRounding.ToNegativeInfinity,
MidpointRounding.ToPositiveInfinity
};
Console.WriteLine($"{s,20}{h1,-10}{h2,-10}{h3,-10}{h4,-10}{h5,-10}");
Console.WriteLine($"{s,20}{cln,10}{cln,10}{cln,10}{cln,10}{cln,10}");
foreach (var mode in modes)
{
var builder = new StringBuilder();
builder.Append($"{mode,-20}");
foreach (var prec in precisions)
{
builder.Append($"{decimal.Round(n, prec, mode),-10}");
}
Console.WriteLine(builder.ToString());
}
结果以整齐的表格形式呈现,以实现清晰度和易于比较。
$ dotnet run
(1) (2) (3) (4) (5)
--------------------------------------------------
ToEven 0.1 0.14 0.143 0.1429 0.14286
ToZero 0.1 0.14 0.142 0.1428 0.14285
AwayFromZero 0.1 0.14 0.143 0.1429 0.14286
ToNegativeInfinity 0.1 0.14 0.142 0.1428 0.14285
ToPositiveInfinity 0.2 0.15 0.143 0.1429 0.14286
此输出显示正十进制值的结果。
$ dotnet run
(1) (2) (3) (4) (5)
--------------------------------------------------
ToEven -0.1 -0.14 -0.143 -0.1429 -0.14286
ToZero -0.1 -0.14 -0.142 -0.1428 -0.14285
AwayFromZero -0.1 -0.14 -0.143 -0.1429 -0.14286
ToNegativeInfinity -0.2 -0.15 -0.143 -0.1429 -0.14286
ToPositiveInfinity -0.1 -0.14 -0.142 -0.1428 -0.14285
此输出显示负十进制值的结果。
C# 带错误处理的取整
此示例演示了带错误处理的取整,以优雅地管理无效输入或边缘情况。
double[] numbers = { 3.14159, double.NaN, double.PositiveInfinity, 2.71828 };
foreach (var num in numbers)
{
try
{
var result = Math.Round(num, 2);
Console.WriteLine($"Rounded {num} to {result}");
}
catch (ArgumentException ex)
{
Console.WriteLine($"Error rounding {num}: {ex.Message}");
}
}
该程序对一个 double 数组进行取整,处理 NaN 和 infinity 等特殊情况,确保稳健的执行。
$ dotnet run Rounded 3.14159 to 3.14 Error rounding NaN: Value is not a number. Error rounding Infinity: Value is not a number. Rounded 2.71828 to 2.72
C# 金融计算中的取整
此示例在金融上下文中应用取整,使用 decimal 类型确保货币值的准确计算。
decimal price = 99.98765m;
decimal taxRate = 0.075m;
decimal tax = price * taxRate;
decimal total = price + tax;
Console.WriteLine($"Price: {price}");
Console.WriteLine($"Tax: {decimal.Round(tax, 2, MidpointRounding.ToEven)}");
Console.WriteLine($"Total: {decimal.Round(total, 2, MidpointRounding.ToEven)}");
该程序计算税收和总价,四舍五入到两位小数以实现标准财务精度。
$ dotnet run Price: 99.98765 Tax: 7.49 Total: 107.48
C# 带自定义精度函数的取整
此示例定义了一个自定义函数,用于以用户指定的精度和模式对数字进行取整,从而增强了灵活性。
double RoundNumber(double value, int decimals, MidpointRounding mode)
{
return Math.Round(value, decimals, mode);
}
double value = 15.62578;
var modes = new[] { MidpointRounding.ToEven, MidpointRounding.AwayFromZero };
foreach (var mode in modes)
{
Console.WriteLine($"Value {value} rounded to 3 decimals ({mode}): " +
$"{RoundNumber(value, 3, mode)}");
}
自定义函数简化了具有可配置参数的取整,展示了可重用代码设计。
$ dotnet run Value 15.62578 rounded to 3 decimals (ToEven): 15.626 Value 15.62578 rounded to 3 decimals (AwayFromZero): 15.626
来源
本教程全面探讨了 C# 中的数字取整,涵盖了基本和高级技巧。
作者
列出所有 C# 教程。