跳至页脚内容
.NET 帮助

C# Round(开发者如何使用)

四舍五入是一个基本的数学概念,通常应用于现实世界的场景。 在 C# 中, Math.Round 方法允许您将值四舍五入到最接近的整数值或特定位数的小数,从而简化了这一操作。 本教程深入探讨了 C# 中舍入的细微差别,并说明如何利用这种强大的方法。

四舍五入简介

舍入一个数字意味着将其调整到最近的整数或小数值,以使其更简单或符合特定要求。 例如,如果您有十进制数 3.14159,将其四舍五入到小数点后两位,则会得到 3.14

为什么要舍入数字?

  1. 简洁性: 整数通常更容易阅读和理解。
  2. 精度: 在某些情况下,使用四舍五入的值而不是精确值进行操作效率更高,尤其是在货币计算等情境下。

常见的舍入场景

  1. 取整: 将小数四舍五入到最接近的整数。
  2. 指定小数位数: 将数字四舍五入到指定的小数位数,例如将 15.678 四舍五入到两位小数,则为 15.68

Basics of Rounding in C#

C# 通过 Math.Round 方法提供了一个强大的舍入系统。 此方法可以接受各种参数和参数以定制舍入操作。

舍入到最近的整数值

最简单的 Math.Round 方法将双精度值四舍五入到最接近的整数值。 如果给定的数字与两个整数等距,则舍入到最接近的偶数,通常称为"银行家舍入"。

double originalValue = 4.5;
double roundedValue = Math.Round(originalValue);
Console.WriteLine($"Original: {originalValue}, Rounded: {roundedValue}");
double originalValue = 4.5;
double roundedValue = Math.Round(originalValue);
Console.WriteLine($"Original: {originalValue}, Rounded: {roundedValue}");
Dim originalValue As Double = 4.5
Dim roundedValue As Double = Math.Round(originalValue)
Console.WriteLine($"Original: {originalValue}, Rounded: {roundedValue}")
$vbLabelText   $csharpLabel

在上面的例子中,4.545 的距离相等。 由于 4 是最接近的偶数,因此该方法返回 4

舍入到特定的小数位数

您还可以使用额外的参数将双精度浮点数舍入到指定的小数位数:

double value = 7.34567;
double rounded = Math.Round(value, 2); // Rounds to two decimal places
Console.WriteLine($"Original: {value}, Rounded: {rounded}");
double value = 7.34567;
double rounded = Math.Round(value, 2); // Rounds to two decimal places
Console.WriteLine($"Original: {value}, Rounded: {rounded}");
Dim value As Double = 7.34567
Dim rounded As Double = Math.Round(value, 2) ' Rounds to two decimal places
Console.WriteLine($"Original: {value}, Rounded: {rounded}")
$vbLabelText   $csharpLabel

由于我们指定将原始值 7.34567 四舍五入到 7.35,因此该方法将原始值 7.35 四舍五入到小数点后两位。

中点舍入模式

当处理中点值(与两个可能四舍五入的值等距的值)时,C# 提供了一种 MidpointRounding 模式来确定如何对这些值进行四舍五入。

默认舍入

默认情况下,Math.Round 将中间值四舍五入到最接近的偶数。

double valueOne = Math.Round(4.5);  // Rounded to 4
double valueTwo = Math.Round(5.5);  // Rounded to 6
double valueOne = Math.Round(4.5);  // Rounded to 4
double valueTwo = Math.Round(5.5);  // Rounded to 6
Dim valueOne As Double = Math.Round(4.5) ' Rounded to 4
Dim valueTwo As Double = Math.Round(5.5) ' Rounded to 6
$vbLabelText   $csharpLabel

指定 MidpointRounding 模式

为了更好地控制中点值的舍入操作,您可以将特定的 MidpointRounding 模式作为参数传入:

double value = 5.5;
double rounded = Math.Round(value, 0, MidpointRounding.AwayFromZero);
Console.WriteLine($"Original: {value}, Rounded: {rounded}");
double value = 5.5;
double rounded = Math.Round(value, 0, MidpointRounding.AwayFromZero);
Console.WriteLine($"Original: {value}, Rounded: {rounded}");
Dim value As Double = 5.5
Dim rounded As Double = Math.Round(value, 0, MidpointRounding.AwayFromZero)
Console.WriteLine($"Original: {value}, Rounded: {rounded}")
$vbLabelText   $csharpLabel

在这个例子中,MidpointRounding.AwayFromZero 模式确保数字四舍五入为 6

使用 Math.Round 进行小数值舍入

虽然我们讨论了双精度值的舍入,C# 也支持小数值的舍入。 这些方法类似,但它们适用于小数数据类型。 下面是一个例子:

decimal decimalValue = 5.678m;
decimal roundedDecimal = Math.Round(decimalValue, 1); // Rounds to one decimal place
Console.WriteLine($"Original: {decimalValue}, Rounded: {roundedDecimal}");
decimal decimalValue = 5.678m;
decimal roundedDecimal = Math.Round(decimalValue, 1); // Rounds to one decimal place
Console.WriteLine($"Original: {decimalValue}, Rounded: {roundedDecimal}");
Dim decimalValue As Decimal = 5.678D
Dim roundedDecimal As Decimal = Math.Round(decimalValue, 1) ' Rounds to one decimal place
Console.WriteLine($"Original: {decimalValue}, Rounded: {roundedDecimal}")
$vbLabelText   $csharpLabel

十进制数 5.678 四舍五入到小数点后一位为 5.7

自定义舍入函数

有时,您可能需要执行标准 Math.Round 方法未涵盖的特定舍入操作。 编写自定义舍入函数可以让您完全控制这个过程。

向上舍入

要始终向上取整到最接近的整数,可以使用 Math.Ceiling 方法:

double value = 4.3;
double roundedUp = Math.Ceiling(value);
Console.WriteLine($"Original: {value}, Rounded Up: {roundedUp}");
double value = 4.3;
double roundedUp = Math.Ceiling(value);
Console.WriteLine($"Original: {value}, Rounded Up: {roundedUp}");
Dim value As Double = 4.3
Dim roundedUp As Double = Math.Ceiling(value)
Console.WriteLine($"Original: {value}, Rounded Up: {roundedUp}")
$vbLabelText   $csharpLabel

十进制数 4.3 向上取整为 5

向下舍入

反之,向下取整到最接近的整数值则使用 Math.Floor 方法:

double value = 4.7;
double roundedDown = Math.Floor(value);
Console.WriteLine($"Original: {value}, Rounded Down: {roundedDown}");
double value = 4.7;
double roundedDown = Math.Floor(value);
Console.WriteLine($"Original: {value}, Rounded Down: {roundedDown}");
Dim value As Double = 4.7
Dim roundedDown As Double = Math.Floor(value)
Console.WriteLine($"Original: {value}, Rounded Down: {roundedDown}")
$vbLabelText   $csharpLabel

十进制数 4.7 向下舍入为 4

处理字符串输入

在许多应用程序中,您可能会处理字符串形式的数值。 使用 C# 可以将字符串解析为双精度或小数,进行舍入,然后转换回去。

解析与舍入

以下是如何舍入包含小数的字符串的示例:

string originalString = "4.5678";
double parsedValue = double.Parse(originalString);
double rounded = Math.Round(parsedValue, 2); // Rounds to two decimal places
string roundedString = rounded.ToString();
Console.WriteLine($"Original: {originalString}, Rounded: {roundedString}");
string originalString = "4.5678";
double parsedValue = double.Parse(originalString);
double rounded = Math.Round(parsedValue, 2); // Rounds to two decimal places
string roundedString = rounded.ToString();
Console.WriteLine($"Original: {originalString}, Rounded: {roundedString}");
Dim originalString As String = "4.5678"
Dim parsedValue As Double = Double.Parse(originalString)
Dim rounded As Double = Math.Round(parsedValue, 2) ' Rounds to two decimal places
Dim roundedString As String = rounded.ToString()
Console.WriteLine($"Original: {originalString}, Rounded: {roundedString}")
$vbLabelText   $csharpLabel

原始:4.5678,舍入后:4.57

金融应用中的舍入

在处理金融应用程序时,精度至关重要。 舍入错误可能导致重大问题。 在这种情况下,由于其比双精度更高的精度,普遍偏爱使用小数类型。

示例舍入货币

以下示例演示了舍入表示货币的小数值:

decimal originalValue = 1234.5678m;
decimal roundedValue = Math.Round(originalValue, 2, MidpointRounding.AwayFromZero);
Console.WriteLine($"Original: {originalValue:C}, Rounded: {roundedValue:C}");
decimal originalValue = 1234.5678m;
decimal roundedValue = Math.Round(originalValue, 2, MidpointRounding.AwayFromZero);
Console.WriteLine($"Original: {originalValue:C}, Rounded: {roundedValue:C}");
Dim originalValue As Decimal = 1234.5678D
Dim roundedValue As Decimal = Math.Round(originalValue, 2, MidpointRounding.AwayFromZero)
Console.WriteLine($"Original: {originalValue:C}, Rounded: {roundedValue:C}")
$vbLabelText   $csharpLabel

上面的代码将值四舍五入到两位小数,以符合大多数货币标准。

调试和排除舍入错误

有时舍入操作可能无法得到预期的结果。 这些差异可能是由于双精度值的浮点精度问题造成的。

常见陷阱

  • 双精度问题: double 类型可能无法始终精确表示十进制数,从而导致意外的舍入结果。 使用 decimal 类型可以缓解这一问题。
  • 中点舍入模式不正确: 请确保根据具体要求使用正确的 MidpointRounding 模式。 误用这些模式可能导致舍入错误。

如何调试

利用工具如日志记录和断点来跟踪舍入前后的值。 检查原始值和传递给舍入方法的参数通常可以揭示不一致之处。

Iron Suite

掌握了 C# 的舍入基础后,您可能想知道在处理复杂数据格式时如何将应用程序提升到一个新的水平。 Iron Suite 可以在此时成为您的救星。 这个套件包含强大的工具,如 IronPDF、IronXL、IronOCR 和 IronBarcode。 让我们深入探讨这些工具如何与您的舍入操作整合,并进一步丰富您的应用程序。

IronPDF

C# 舍入(开发人员的使用原理)图 1

IronPDF 是一个用 C# 设计的强大库,用于从 HTML 中生成 PDF、进行编辑和管理。 想象一下,一个场景是,您在执行舍入操作后需要生成 PDF 格式的报告。 IronPDF 可以轻松地将您的 C# 代码转换为高质量的 PDF。

using IronPdf;
using System;

class Program
{
    static void Main(string[] args)
    {
        // Sample data for invoice
        decimal itemPrice = 49.995m; // Item price before rounding
        decimal taxRate = 0.18m;     // 18% tax rate

        // Round price to 2 decimal places
        decimal roundedPrice = Math.Round(itemPrice, 2);

        // Calculate and round the tax amount
        decimal taxAmount = Math.Round(roundedPrice * taxRate, 2);

        // Calculate the total amount
        decimal totalAmount = Math.Round(roundedPrice + taxAmount, 2);

        // Create simple HTML content for the PDF
        string htmlContent = $@"
            <h1>Invoice</h1>
            <p>Item Price: ${roundedPrice}</p>
            <p>Tax (18%): ${taxAmount}</p>
            <hr>
            <h2>Total Amount: ${totalAmount}</h2>
        ";

        // Generate PDF using IronPDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF file
        pdfDocument.SaveAs("Invoice.pdf");

        Console.WriteLine("PDF invoice generated successfully with rounded values.");
    }
}
using IronPdf;
using System;

class Program
{
    static void Main(string[] args)
    {
        // Sample data for invoice
        decimal itemPrice = 49.995m; // Item price before rounding
        decimal taxRate = 0.18m;     // 18% tax rate

        // Round price to 2 decimal places
        decimal roundedPrice = Math.Round(itemPrice, 2);

        // Calculate and round the tax amount
        decimal taxAmount = Math.Round(roundedPrice * taxRate, 2);

        // Calculate the total amount
        decimal totalAmount = Math.Round(roundedPrice + taxAmount, 2);

        // Create simple HTML content for the PDF
        string htmlContent = $@"
            <h1>Invoice</h1>
            <p>Item Price: ${roundedPrice}</p>
            <p>Tax (18%): ${taxAmount}</p>
            <hr>
            <h2>Total Amount: ${totalAmount}</h2>
        ";

        // Generate PDF using IronPDF
        var renderer = new ChromePdfRenderer();
        var pdfDocument = renderer.RenderHtmlAsPdf(htmlContent);

        // Save the PDF file
        pdfDocument.SaveAs("Invoice.pdf");

        Console.WriteLine("PDF invoice generated successfully with rounded values.");
    }
}
Imports IronPdf
Imports System

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		' Sample data for invoice
		Dim itemPrice As Decimal = 49.995D ' Item price before rounding
		Dim taxRate As Decimal = 0.18D ' 18% tax rate

		' Round price to 2 decimal places
		Dim roundedPrice As Decimal = Math.Round(itemPrice, 2)

		' Calculate and round the tax amount
		Dim taxAmount As Decimal = Math.Round(roundedPrice * taxRate, 2)

		' Calculate the total amount
		Dim totalAmount As Decimal = Math.Round(roundedPrice + taxAmount, 2)

		' Create simple HTML content for the PDF
		Dim htmlContent As String = $"
            <h1>Invoice</h1>
            <p>Item Price: ${roundedPrice}</p>
            <p>Tax (18%): ${taxAmount}</p>
            <hr>
            <h2>Total Amount: ${totalAmount}</h2>
        "

		' Generate PDF using IronPDF
		Dim renderer = New ChromePdfRenderer()
		Dim pdfDocument = renderer.RenderHtmlAsPdf(htmlContent)

		' Save the PDF file
		pdfDocument.SaveAs("Invoice.pdf")

		Console.WriteLine("PDF invoice generated successfully with rounded values.")
	End Sub
End Class
$vbLabelText   $csharpLabel

IronXL 是一个 Excel 库,可帮助处理 Excel 文件而无需安装 Excel。

C# 舍入(开发人员的使用原理)图 2

IronXL 提供了用于处理 Excel 文件的功能,使 C# 开发人员能够无缝读取、编写和操作 Excel 电子表格。 使用 IronXL,您可以从 Excel 表中检索小数或双精度数据,在 C# 中执行舍入操作。

IronOCR

C# 舍入(开发人员的使用原理)图 3

IronOCR 是一个高级的光学字符识别(OCR)库,为 C# 提供识别和提取图像和 PDF 中的文本的能力。 假设您有包含数值数据的扫描文档或图像。 使用 IronOCR,您可以提取这些数据,在 C# 中处理或舍入它。

IronBarcode 是一个专为 .NET 框架设计的条码读取和写入库。

C# 舍入(开发人员的使用原理)图 4

IronBarcode 是一个强大的工具,用于在 .NET 中生成、读取和分类条形码和 QR 码。 在需要将舍入数据编码到条形码中的背景下(例如,零售应用程序中的产品定价),IronBarcode 可以非常有价值。

结论

在 C# 中舍入是一个多面的主题,在各个领域都有应用。 了解诸如 Math.RoundMath.FloorMath.Ceiling 之类的内置方法,并知道何时使用适当的数据类型(double 或 decimal),将使您能够有效地处理数值数据。

使用 C# 中的舍入使得数字更容易处理。 但是如果您想对这些数字做更多的操作呢? 这就是 Iron Suite 发挥作用的地方。 它是一套可以帮助您处理 PDF、Excel 文件、图片中的文字和条形码的工具。

令人兴奋的是:可以通过 试用许可证 免费试用这些工具,然后决定是否适合自己的需求。 如果决定购买,每个工具的售价为 liteLicense。 若要购买全套,则只需支付两个工具的费用即可获得整套产品。 相当于以两个工具的价格获得四个工具! 请查看 Iron Suite 的 许可证页面 获取更多信息。

常见问题解答

如何在 C# 中对财务应用程序的数字进行舍入?

在 C# 中,您可以使用 `decimal` 数据类型的 `Math.Round` 方法,以在金融应用程序中获得更高的精度。建议使用 `MidpointRounding.AwayFromZero` 来确保金融交易的精确舍入。

C# 中的默认舍入模式是什么?

C# 中的默认舍入模式是“银行家舍入”,它使用 `MidpointRounding.ToEven` 选项将中点值舍入到最接近的偶数。

在 C# 中将 HTML 转换为 PDF 时舍入如何工作?

通过使用 IronPDF 将 HTML 转换为 PDF,您可以在渲染到 PDF 文档之前通过在 C# 中处理数据来为数值数据合并舍入操作。

我可以在 Excel 文件中的数据中使用 C# 舍入方法吗?

是的,您可以使用 IronXL 在 C# 中处理 Excel 文件,应用舍入方法到单元格中的数值数据,使用 `Math.Round` 进行精确的数据表示。

在 C# 中,MidpointRounding 枚举的意义是什么?

C# 中的 `MidpointRounding` 枚举提供了舍入中点值的选项,例如 `AwayFromZero` 和 `ToEven`,允许开发人员控制舍入应用于恰好位于两个整数之间的数字的方式。

如何在 C# 中应用自定义舍入函数?

您可以通过编写自己的逻辑在 C# 中创建自定义舍入函数来处理超出标准 `Math.Round` 方法的特定舍入规则,这些规则可以与 Iron Software 工具集成,增强数据处理。

在 C# 中,字符串输入值可以舍入吗?

是的,可以将字符串输入解析为 `double` 或 `decimal` 等数值类型,允许您应用舍入方法,然后将它们转换回字符串以供进一步使用。

IronOCR 和 IronBarcode 等工具如何从舍入操作中受益?

IronOCR 可以使用舍入来处理从文本识别中提取的数值数据,而 IronBarcode 可以将舍入后的值集成到条形码数据中,以便精确编码数值信息。

Jacob Mellor,Team Iron 的首席技术官
首席技术官

Jacob Mellor 是 Iron Software 的首席技术官,也是一位开创 C# PDF 技术的有远见的工程师。作为 Iron Software 核心代码库的原始开发者,他从公司成立之初就开始塑造公司的产品架构,与首席执行官 Cameron Rimington 一起将公司转变为一家拥有 50 多名员工的公司,为 NASA、特斯拉和全球政府机构提供服务。

Jacob 拥有曼彻斯特大学土木工程一级荣誉工程学士学位(BEng)(1998-2001 年)。他的旗舰产品 IronPDF 和 Iron Suite for .NET 库在全球的 NuGet 安装量已超过 3000 万次,其基础代码继续为全球使用的开发人员工具提供动力。Jacob 拥有 25 年的商业经验和 41 年的编码专业知识,他一直专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我