.NET 帮助

Math.Round C# (它是如何为开发人员工作的)

发布 2024年三月6日
分享:

在C#编程领域,Math.Round值方法在对数值进行四舍五入时起着关键作用,尤其是在处理double值和decimal值数据类型时。此方法允许开发人员将给定的数值四舍五入到最接近的整数值或指定的小数位数,为数学运算提供灵活性和精确度。 有几种舍入类型可用,例如中点舍入。 在本文中,我们将深入探讨 C# 中 Math.Round 的复杂性,探索其各个方面及使用场景。 在本文的后续部分中,我们将探讨该IronPDF图书馆铁软件用于处理 PDF 文件。

C&num 中的 Math.Round 基础知识;

Math.Round 方法

在C#中,Math.Round方法是一个功能强大的工具,可以使用指定的舍入方式对小数位进行舍入。 它是System命名空间的一部分,并提供多种重载以适应不同的舍入操作。

/* methods overloaded by Math.Round
Math.Round(Double)
Math.Round(Double, Int32) // int32 specifies number of fractional digits
Math.Round(Double, Int32, MidpointRounding)  // int32 specifies number of fractional digits, MidpointRounding type of rounding method
Math.Round(Double, MidpointRounding)  // MidpointRounding type of rounding method
Math.Round(Decimal)
Math.Round(Decimal, Int32) // int32 specifies number of fractional digits
Math.Round(Decimal, Int32, MidpointRounding)
Math.Round(Decimal, MidpointRounding)
*/
/* methods overloaded by Math.Round
Math.Round(Double)
Math.Round(Double, Int32) // int32 specifies number of fractional digits
Math.Round(Double, Int32, MidpointRounding)  // int32 specifies number of fractional digits, MidpointRounding type of rounding method
Math.Round(Double, MidpointRounding)  // MidpointRounding type of rounding method
Math.Round(Decimal)
Math.Round(Decimal, Int32) // int32 specifies number of fractional digits
Math.Round(Decimal, Int32, MidpointRounding)
Math.Round(Decimal, MidpointRounding)
*/
' methods overloaded by Math.Round
'Math.Round(Double)
'Math.Round(Double, Int32) // int32 specifies number of fractional digits
'Math.Round(Double, Int32, MidpointRounding)  // int32 specifies number of fractional digits, MidpointRounding type of rounding method
'Math.Round(Double, MidpointRounding)  // MidpointRounding type of rounding method
'Math.Round(Decimal)
'Math.Round(Decimal, Int32) // int32 specifies number of fractional digits
'Math.Round(Decimal, Int32, MidpointRounding)
'Math.Round(Decimal, MidpointRounding)
'
VB   C#

四舍五入双精度值

处理双精度值时,Math.Round 通常用于将数字四舍五入到最接近的整数。 例如:

double originalValue = 3.75;
double roundedValue = Math.Round(originalValue);
// Output: 4
double originalValue = 3.75;
double roundedValue = Math.Round(originalValue);
// Output: 4
Dim originalValue As Double = 3.75
Dim roundedValue As Double = Math.Round(originalValue)
' Output: 4
VB   C#

在本例中,Math.Round 方法将原始的 double 值 3.75 四舍五入为最接近的整数值,即 4。

四舍五入小数值

同样,Math.Round 方法适用于十进制值。 考虑以下示例:

decimal originalValue = 8.625m;
decimal roundedValue = Math.Round(originalValue, 2);
// Output: 8.63
decimal originalValue = 8.625m;
decimal roundedValue = Math.Round(originalValue, 2);
// Output: 8.63
Dim originalValue As Decimal = 8.625D
Dim roundedValue As Decimal = Math.Round(originalValue, 2)
' Output: 8.63
VB   C#

这里使用 Math.Round 方法将小数 8.625 四舍五入到小数点后两位,得到四舍五入后的数值 8.63。

最近整数值

Math.Round的主要目的是将给定的数值四舍五入为最接近的整数。 如果小数部分正好介于两个整数之间,该方法遵循规定的四舍五入操作约定。 MidpointRounding枚举可以用作Math.Round方法中的参数,决定是向最近的偶数还是奇数进行四舍五入。

如上图所示,可以进行几种类型的舍入操作。 名字本身就是不言自明的。

指定的舍入惯例

让我们探索如何使用MidpointRounding模式:

double originalValue = 5.5;
double roundedValueEven = Math.Round(originalValue, MidpointRounding.ToEven);
double roundedValueOdd = Math.Round(originalValue, MidpointRounding.AwayFromZero);
// Output: roundedValueEven = 6, roundedValueOdd = 5
double originalValue = 5.5;
double roundedValueEven = Math.Round(originalValue, MidpointRounding.ToEven);
double roundedValueOdd = Math.Round(originalValue, MidpointRounding.AwayFromZero);
// Output: roundedValueEven = 6, roundedValueOdd = 5
Dim originalValue As Double = 5.5
Dim roundedValueEven As Double = Math.Round(originalValue, MidpointRounding.ToEven)
Dim roundedValueOdd As Double = Math.Round(originalValue, MidpointRounding.AwayFromZero)
' Output: roundedValueEven = 6, roundedValueOdd = 5
VB   C#

在本例中,将数值舍入到 5.5 时,MidpointRounding.ToEven 向最接近的偶数舍入(导致 6)而 MidpointRounding.AwayFromZero 则从 0 开始舍入,得到 5。

舍入到指定的小数位数

要将数字四舍五入到指定的小数位数,可以使用 Math.Round 方法,并包含一个表示整数位数的附加参数:

decimal originalValue = 9.123456m;
decimal roundedValue = Math.Round(originalValue, 3); // round values
// Output: 9.123
decimal originalValue = 9.123456m;
decimal roundedValue = Math.Round(originalValue, 3); // round values
// Output: 9.123
Dim originalValue As Decimal = 9.123456D
Dim roundedValue As Decimal = Math.Round(originalValue, 3) ' round values
' Output: 9.123
VB   C#

这里,十进制数 9.123456 四舍五入到小数点后三位,得出四舍五入后的数值 9.123。

C#中的中点值和四舍五入约定

当结果中最低有效位后的值正好位于两个数字之间的一半时,就会出现中点值。 例如,2.56500是一个中点值,当四舍五入到小数点后两位时为2.57,而3.500是一个中点值,当四舍五入到整数时为4。挑战在于在四舍五入到最接近值的策略中识别没有明确舍入规则的中点值的最接近值。

C# 中的 Round 方法支持两种用于处理中间值的舍入约定:

远离零的舍入:中点值会被舍入到离零更远的下一个数字。 例如,3.75被四舍五入为3.8,3.85被四舍五入为3.9,-3.75被四舍五入为-3.8,-3.85被四舍五入为-3.9。此方法由MidpointRounding.AwayFromZero枚举成员表示。

四舍六入五成双(银行家四舍五入): 中点值被四舍五入到最接近的偶数。 实例包括3.75和3.85四舍五入到3.8,以及-3.75和-3.85四舍五入到-3.8。这种舍入方法由MidpointRounding.ToEven枚举成员表示。

decimal [] decimalSampleValues = { 1.15m, 1.25m, 1.35m, 1.45m, 1.55m, 1.65m };
decimal sum = 0;
// Calculate true mean values.
foreach (var value in decimalSampleValues)
{ 
    sum += value; 
}
// print
Console.WriteLine("True mean values:     {0:N2}", sum / decimalSampleValues.Length);
// Calculate mean values with rounding away from zero.
sum = 0;
foreach (var value in decimalSampleValues)
{ 
    sum += Math.Round(value, 1, MidpointRounding.AwayFromZero); 
}
// print
Console.WriteLine("AwayFromZero:  {0:N2}", sum / decimalSampleValues.Length);
// Calculate mean values with rounding to nearest.
sum = 0;
foreach (var value in decimalSampleValues)
{ 
    sum += Math.Round(value, 1, MidpointRounding.ToEven); 
}
// print
Console.WriteLine("ToEven:        {0:N2}", sum / decimalSampleValues.Length);
decimal [] decimalSampleValues = { 1.15m, 1.25m, 1.35m, 1.45m, 1.55m, 1.65m };
decimal sum = 0;
// Calculate true mean values.
foreach (var value in decimalSampleValues)
{ 
    sum += value; 
}
// print
Console.WriteLine("True mean values:     {0:N2}", sum / decimalSampleValues.Length);
// Calculate mean values with rounding away from zero.
sum = 0;
foreach (var value in decimalSampleValues)
{ 
    sum += Math.Round(value, 1, MidpointRounding.AwayFromZero); 
}
// print
Console.WriteLine("AwayFromZero:  {0:N2}", sum / decimalSampleValues.Length);
// Calculate mean values with rounding to nearest.
sum = 0;
foreach (var value in decimalSampleValues)
{ 
    sum += Math.Round(value, 1, MidpointRounding.ToEven); 
}
// print
Console.WriteLine("ToEven:        {0:N2}", sum / decimalSampleValues.Length);
Dim decimalSampleValues() As Decimal = { 1.15D, 1.25D, 1.35D, 1.45D, 1.55D, 1.65D }
Dim sum As Decimal = 0
' Calculate true mean values.
For Each value In decimalSampleValues
	sum += value
Next value
' print
Console.WriteLine("True mean values:     {0:N2}", sum / decimalSampleValues.Length)
' Calculate mean values with rounding away from zero.
sum = 0
For Each value In decimalSampleValues
	sum += Math.Round(value, 1, MidpointRounding.AwayFromZero)
Next value
' print
Console.WriteLine("AwayFromZero:  {0:N2}", sum / decimalSampleValues.Length)
' Calculate mean values with rounding to nearest.
sum = 0
For Each value In decimalSampleValues
	sum += Math.Round(value, 1, MidpointRounding.ToEven)
Next value
' print
Console.WriteLine("ToEven:        {0:N2}", sum / decimalSampleValues.Length)
VB   C#

输出

Math.Round C#(如何为开发人员工作):图 1 - 双精度浮点输出

中点舍入模式

Math.Round C#(开发人员如何使用):图 2 - 中点舍入

AwayFromZero: 1

AwayFromZero 四舍五入策略是在一个数字位于两个其他数字之间的中间位置时,向最接近的数字舍入。

ToZero:2

该策略的特点是向零方向舍入。 结果是最接近且不大于无限精确结果的数值。

ToEven: 0

该策略涉及四舍五入到最接近的数字,当一个数字位于两个其他数字的中间时,它将被四舍五入到最接近的偶数。

ToNegativeInfinity: 3

该策略涉及向下舍入,使结果尽可能接近并且不大于无限精确的结果。

正无穷: 4

此策略涉及向上舍入,结果将是最接近且不低于无限精确结果。

精度和双精度浮点运算

精确度和双精度值

在处理双精度浮点数时,了解由于浮点表示的性质而可能产生的不精确性是至关重要的。 Math.Round 方法通过将值舍入到最接近的整数或指定的小数位数来帮助缓解精度问题。

使用 Math.Round 指定精度

开发人员可以利用 Math.Round 方法在计算中实现所需的精度:

double originalValue = 123.456789;
double result = Math.Round(originalValue, 4);
// Output: 123.4568, rounded value
double originalValue = 123.456789;
double result = Math.Round(originalValue, 4);
// Output: 123.4568, rounded value
Dim originalValue As Double = 123.456789
Dim result As Double = Math.Round(originalValue, 4)
' Output: 123.4568, rounded value
VB   C#

在本例中,双数值 123.456789 四舍五入到小数点后四位,得到更精确的数值 123.4568。

中点四舍五入策略

处理中点值

当小数值恰好位于两个整数之间时,舍入策略变得至关重要。 Math.Round 方法使用指定的 MidpointRounding 策略来解决此类情况。

Midpoint Rounding 示例

请考虑以下使用中点舍入的示例:

double originalValue = 7.5;
double roundedValue = Math.Round(originalValue, MidpointRounding.AwayFromZero);
// Output: 8
double originalValue = 7.5;
double roundedValue = Math.Round(originalValue, MidpointRounding.AwayFromZero);
// Output: 8
Dim originalValue As Double = 7.5
Dim roundedValue As Double = Math.Round(originalValue, MidpointRounding.AwayFromZero)
' Output: 8
VB   C#

在这里,数值 7.5 从零四舍五入,得到四舍五入后的数值 8。

实际应用场景

以下是其在不同背景中的一些应用示例:

财务计算

在金融应用中,精确的舍入至关重要。 例如,在计算利率、货币兑换或处理税务计算时,可以使用Math.Round方法确保结果被四舍五入到适当的小数位数,以符合财务标准。

double interestRate = 0.04567;
double roundedInterest = Math.Round(interestRate, 4); // Round to 4 decimal places
double interestRate = 0.04567;
double roundedInterest = Math.Round(interestRate, 4); // Round to 4 decimal places
Dim interestRate As Double = 0.04567
Dim roundedInterest As Double = Math.Round(interestRate, 4) ' Round to 4 decimal places
VB   C#

用户界面显示

在用户界面中呈现数值时,通常会对数字进行四舍五入以提高可读性。 例如,在显示温度读数或财务数据的仪表盘中,使用 Math.Round 进行四舍五入可以增强所呈现信息的清晰度。

double temperature = 23.678;
double roundedTemperature = Math.Round(temperature, 1); // Round to 1 decimal place
double temperature = 23.678;
double roundedTemperature = Math.Round(temperature, 1); // Round to 1 decimal place
Dim temperature As Double = 23.678
Dim roundedTemperature As Double = Math.Round(temperature, 1) ' Round to 1 decimal place
VB   C#

统计分析

在统计分析中,精确的舍入对于避免引入偏差或不准确性至关重要。 无论是计算平均值、中位数,还是其他统计指标,Math.Round 方法都可以帮助以所需的精确度呈现结果。

double meanValue = CalculateMean(data);
double roundedMean = Math.Round(meanValue, 2); // Round mean value to 2 decimal places
double meanValue = CalculateMean(data);
double roundedMean = Math.Round(meanValue, 2); // Round mean value to 2 decimal places
Dim meanValue As Double = CalculateMean(data)
Dim roundedMean As Double = Math.Round(meanValue, 2) ' Round mean value to 2 decimal places
VB   C#

科学计算

在科学应用中,精确度至关重要。 在处理实验数据或科学计算时,使用 Math.Round 进行四舍五入可以确保结果以有意义和准确的方式呈现。

double experimentalResult = 9.87654321;
double roundedResult = Math.Round(experimentalResult, 5); // Round to 5 decimal places
double experimentalResult = 9.87654321;
double roundedResult = Math.Round(experimentalResult, 5); // Round to 5 decimal places
Dim experimentalResult As Double = 9.87654321
Dim roundedResult As Double = Math.Round(experimentalResult, 5) ' Round to 5 decimal places
VB   C#

数学建模

在实现数学模型或模拟时,舍入可能是简化复杂计算所必需的。 Math.Round 方法可用于控制建模过程中中间结果的精度。

double modelResult = SimulatePhysicalSystem(parameters);
double roundedModelResult = Math.Round(modelResult, 3); // Round to 3 decimal places
double modelResult = SimulatePhysicalSystem(parameters);
double roundedModelResult = Math.Round(modelResult, 3); // Round to 3 decimal places
Dim modelResult As Double = SimulatePhysicalSystem(parameters)
Dim roundedModelResult As Double = Math.Round(modelResult, 3) ' Round to 3 decimal places
VB   C#

游戏开发

在游戏开发中,数值精度对于物理计算、定位和其他数学运算至关重要。 Math.Round 方法可用于确保与游戏相关的值四舍五入到适当的精确度。

double playerPosition = CalculatePlayerPosition();
double roundedPosition = Math.Round(playerPosition, 2); // Round to 2 decimal places
double playerPosition = CalculatePlayerPosition();
double roundedPosition = Math.Round(playerPosition, 2); // Round to 2 decimal places
Dim playerPosition As Double = CalculatePlayerPosition()
Dim roundedPosition As Double = Math.Round(playerPosition, 2) ' Round to 2 decimal places
VB   C#

在上述每种情况下,Math.Round 方法都允许开发人员控制数值的精度,从而提高应用程序的准确性和可读性。

介绍IronPDF

IronPDF 的核心功能是其HTML 转 PDF函数,保持布局和样式。 它将网络内容转换为PDF,非常适合报告、发票和文档。 您可以轻松地将 HTML 文件、URL 和 HTML 字符串转换为 PDF。

using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        // 1. Convert HTML String to PDF
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>";
        var pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent);
        pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf");

        // 2. Convert HTML File to PDF
        var htmlFilePath = "path_to_your_html_file.html"; // Specify the path to your HTML file
        var pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath);
        pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf");

        // 3. Convert URL to PDF
        var url = "http://ironpdf.com"; // Specify the URL
        var pdfFromUrl = renderer.RenderUrlAsPdf(url);
        pdfFromUrl.SaveAs("URLToPDF.pdf");
    }
}
Imports IronPdf

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim renderer = New ChromePdfRenderer()

		' 1. Convert HTML String to PDF
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is a PDF from an HTML string.</p>"
		Dim pdfFromHtmlString = renderer.RenderHtmlAsPdf(htmlContent)
		pdfFromHtmlString.SaveAs("HTMLStringToPDF.pdf")

		' 2. Convert HTML File to PDF
		Dim htmlFilePath = "path_to_your_html_file.html" ' Specify the path to your HTML file
		Dim pdfFromHtmlFile = renderer.RenderHtmlFileAsPdf(htmlFilePath)
		pdfFromHtmlFile.SaveAs("HTMLFileToPDF.pdf")

		' 3. Convert URL to PDF
		Dim url = "http://ironpdf.com" ' Specify the URL
		Dim pdfFromUrl = renderer.RenderUrlAsPdf(url)
		pdfFromUrl.SaveAs("URLToPDF.pdf")
	End Sub
End Class
VB   C#

现在让我们看看如何使用以下工具生成 PDF 文档IronPDFC# PDF 库来自铁软件.

安装

您可以选择通过 NuGet 包管理器控制台或 Visual Studio 包管理器安装 IronPDF。

dotnet add package IronPdf
dotnet add package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'dotnet add package IronPdf
VB   C#

在搜索栏中搜索 "ironpdf",使用 NuGet 包管理器安装 IronPDF。

使用 IronPDF 生成 PDF

Console.WriteLine("Params Example");
List<string> cart = new List<string>();
void AddItems(params string [] items)
{
    for (int i = 0; i < items.Length; i++)
    {
        cart.Add(items [i]);
    }
}
Console.WriteLine("Enter the cart items as comma separated ");
var itemsString = Console.ReadLine();
if (itemsString != null)
{
    var items = itemsString.Split(",").ToArray();
    AddItems(items);
}
AddItems("Sample1", "Sample2");
Console.WriteLine("-------------------------------------------------------");
Console.WriteLine("Display Cart");
string name = "Sam";
var count = cart.Count;
string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" +
string.Join("\n", cart.Select(x => $"<p>{x}</p>"))
+ @"
</body>
</html>";
// Create a new PDF document
var pdfDocument = new ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(content).SaveAs("cart.pdf");
Console.WriteLine("Params Example");
List<string> cart = new List<string>();
void AddItems(params string [] items)
{
    for (int i = 0; i < items.Length; i++)
    {
        cart.Add(items [i]);
    }
}
Console.WriteLine("Enter the cart items as comma separated ");
var itemsString = Console.ReadLine();
if (itemsString != null)
{
    var items = itemsString.Split(",").ToArray();
    AddItems(items);
}
AddItems("Sample1", "Sample2");
Console.WriteLine("-------------------------------------------------------");
Console.WriteLine("Display Cart");
string name = "Sam";
var count = cart.Count;
string content = $@"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" +
string.Join("\n", cart.Select(x => $"<p>{x}</p>"))
+ @"
</body>
</html>";
// Create a new PDF document
var pdfDocument = new ChromePdfRenderer();
pdfDocument.RenderHtmlAsPdf(content).SaveAs("cart.pdf");
Imports Microsoft.VisualBasic

Console.WriteLine("Params Example")
Dim cart As New List(Of String)()
'INSTANT VB TODO TASK: Local functions are not converted by Instant VB:
'void AddItems(params string [] items)
'{
'	for (int i = 0; i < items.Length; i++)
'	{
'		cart.Add(items [i]);
'	}
'}
Console.WriteLine("Enter the cart items as comma separated ")
Dim itemsString = Console.ReadLine()
If itemsString IsNot Nothing Then
	Dim items = itemsString.Split(",").ToArray()
	AddItems(items)
End If
AddItems("Sample1", "Sample2")
Console.WriteLine("-------------------------------------------------------")
Console.WriteLine("Display Cart")
Dim name As String = "Sam"
Dim count = cart.Count
Dim content As String = $"<!DOCTYPE html>
<html>
<body>
<h1>Hello, {name}!</h1>
<p>You have {count} items in the cart.</p>
" & String.Join(vbLf, cart.Select(Function(x) $"<p>{x}</p>")) & "
</body>
</html>"
' Create a new PDF document
Dim pdfDocument = New ChromePdfRenderer()
pdfDocument.RenderHtmlAsPdf(content).SaveAs("cart.pdf")
VB   C#

在上述代码中,我们为购物车项目生成 HTML 文档,然后使用 IronPDF 将其保存为 PDF 文档。

输出

Math.Round C#(开发人员如何使用):图 3 - 上述代码的输出结果

许可(可免费试用)

要启用所提供代码的功能,必须获取许可证密钥。 您可以从此位置获取试用密钥*这里***必须插入到 appsettings.json 文件中。

"IronPdf.LicenseKey": "your license key"
"IronPdf.LicenseKey": "your license key"
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'"IronPdf.LicenseKey": "your license key"
VB   C#

提供您的电子邮件 ID,即可获得试用版许可证。

结论

总之,C#中的Math.Round方法是一个用于舍入double和decimal值的多功能工具,为开发人员提供了将数值舍入到最近的整数或指定小数位数的灵活性。 了解Math.Round的复杂性,包括对中点值的处理以及使用MidpointRounding策略,对于在C#编程中进行准确可靠的数学操作至关重要。 无论是在处理财务计算、用户界面显示,还是其他需要精确数值表示的场景中,Math.Round 方法都被证明是程序员工具包中不可或缺的资产。 此外,我们还看到IronPDF是一个用于生成PDF文档的多功能库。

< 前一页
C# 计时器(其对开发者的运作方式)
下一步 >
C# ArrayList(开发者如何使用)

准备开始了吗? 版本: 2024.12 刚刚发布

免费NuGet下载 总下载量: 11,781,565 查看许可证 >