跳至页脚内容
.NET 帮助

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

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

引入四舍五入

舍入一个数字意味着将其调整到最近的整数或小数值,以使其更简单或符合特定要求。 例如,当您有小数 3.14159 时,将其舍入到两位小数将得到 3.14

为什么要舍入数字?

  1. 简化:舍入的数字通常更易于阅读和理解。
  2. 精度:在某些情况下,操作舍入值而不是精确值更高效,特别是在货币计算背景下。

常见的舍入场景

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

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

中点舍入模式

在处理中点值(即与两个可能的舍入值等距)时,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

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

调试和排除舍入错误

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

常见陷阱

  • 双精度精度:双精度类型可能并不总是精确表示小数,导致意外的舍入结果。 使用小数类型可以缓解这一点。
  • 错误的 MidpointRounding 模式:确保使用正确的 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 这样的内置方法,并知道何时使用适当的数据类型(双精度或小数),将使您能够有效地处理数值数据。

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

这里是令人兴奋的部分:您可以获得免费的 试用许可证 来尝试这些工具,看您是否喜欢它们。 如果您决定购买,价格为 liteLicense。 但如果您想购买所有这些,您可以仅花两个工具的钱买到整个套件。 这就像得到四个工具,但只需要支付两个! 查看 Iron Suite 的 [许可证页面](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 拥有曼彻斯特大学 (1998-2001) 的一级荣誉土木工程学士学位。1999 年在伦敦创办了自己的第一家软件公司,并于 2005 年创建了他的第一个 .NET 组件后,他专注于解决微软生态系统中的复杂问题。

他的旗舰 IronPDF 和 Iron Suite .NET 库在全球已获得超过 3000 万次的 NuGet 安装,其基础代码继续为全球使用的开发者工具提供支持。拥有 25 年商业经验和 41 年编程经验的 Jacob 仍专注于推动企业级 C#、Java 和 Python PDF 技术的创新,同时指导下一代技术领导者。