Saltar al pie de página
.NET AYUDA

C# Round (Cómo funciona para desarrolladores)

Redondear números es un concepto matemático fundamental, a menudo aplicado en escenarios del mundo real. En C#, el método Math.Round facilita esto permitiéndote redondear valores al valor entero más cercano o a un número específico de decimales. Este tutorial profundiza en las complejidades del redondeo en C# e ilustra cómo puedes aprovechar este poderoso método.

Introducción al redondeo

Redondear un número implica ajustarlo al valor integral o decimal más cercano para simplificarlo o cumplir con un requisito particular. Por ejemplo, cuando tienes el número decimal 3.14159, redondearlo a dos decimales resultaría en 3.14.

¿Por qué números redondos?

  1. Simplicidad: Los números redondeados suelen ser más fáciles de leer y comprender.
  2. Precisión: En algunos casos, operar sobre valores redondeados en lugar de exactos es más eficiente, especialmente en contextos como cálculos de moneda.

Escenarios comunes de redondeo

  1. Entero Más Cercano: Redondear un valor decimal a su número entero más cercano.
  2. Número Específico de Decimales: Redondear un número a un número específico de decimales, como redondear 15.678 a dos decimales sería 15.68.

Básicos del redondeo en C#

C# ofrece un sistema robusto para redondear a través del método Math.Round. Este método puede aceptar varios argumentos y parámetros para personalizar la operación de redondeo.

Redondear a la integral más próxima

La forma más simple del método Math.Round redondea un valor doble al valor integral más cercano. Si el número dado está equidistante de dos enteros, redondea al número par más cercano, a menudo llamado "redondeo del banquero".

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

En el ejemplo anterior, 4.5 está equidistante de 4 y 5. Dado que 4 es el número par más cercano, el método devuelve 4.

Redondear a un número específico de decimales

También puedes redondear un número de punto flotante de doble precisión a un número específico de decimales utilizando un argumento adicional:

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

El método redondea el valor original 7.34567 a 7.35 ya que hemos especificado redondear a dos decimales.

Modos de redondeo de punto medio

Al tratar con valores de punto medio (aquellos equidistantes de dos valores potencialmente redondeados), C# ofrece un modo MidpointRounding para determinar cómo se redondean estos valores.

Redondeo por defecto

Por defecto, método Math.Round redondea los valores del punto medio al número par más cercano.

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

Especificación del modo MidpointRounding

Para proporcionar más control sobre la operación de redondeo para los valores de punto medio, puedes pasar un modo MidpointRounding específico como parámetro:

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

En este ejemplo, el modo MidpointRounding.AwayFromZero asegura que el número sea redondeado a 6.

Uso de Math.Round con valores decimales

Aunque hemos discutido el redondeo de valores dobles, C# también soporta el redondeo de valores decimales. Los métodos son análogos, pero funcionan con el tipo de datos decimal. Aquí hay un ejemplo:

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

El número decimal 5.678 se redondea a 5.7 cuando se redondea a un decimal.

Funciones de redondeo personalizadas

A veces, puedes necesitar realizar operaciones de redondeo específicas no cubiertas por el método estándar Math.Round. Escribir funciones de redondeo personalizadas te da el control completo sobre el proceso.

Redacción

Para redondear siempre hacia arriba al número entero más cercano, puedes usar el método 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

El número decimal 4.3 se redondea hacia arriba a 5.

Redacción

Por el contrario, redondear hacia abajo al valor integral más cercano se hace utilizando el método 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

El número decimal 4.7 se redondea hacia abajo a 4.

Trabajar con cadenas de entrada

En muchas aplicaciones, podrías lidiar con valores numéricos como cadenas de texto. El análisis de la cadena a un doble o decimal, redondearla y luego convertirla de nuevo se puede hacer usando C#.

Parificación y redondeo

Aquí tienes un ejemplo de cómo redondear una cadena que contiene un número decimal:

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

Original: 4.5678, Redondeado: 4.57

Redondeo en aplicaciones financieras

Al trabajar con aplicaciones financieras, la precisión es vital. Los errores de redondeo pueden llevar a problemas significativos. En tales casos, se prefiere el tipo decimal debido a su mayor precisión en comparación con el doble.

Ejemplo de redondeo de moneda

El siguiente ejemplo demuestra el redondeo de un valor decimal que representa moneda:

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

El código anterior redondea el valor a dos decimales, manteniéndose en línea con la mayoría de los estándares de moneda.

Depuración y solución de errores de redondeo

Ocasionalmente, las operaciones de redondeo podrían no dar los resultados esperados. Estas discrepancias podrían deberse a problemas como la precisión de punto flotante con valores dobles.

Trampas comunes

  • Precisión de Doble: El tipo doble podría no siempre representar números decimales exactamente, lo que lleva a resultados de redondeo inesperados. Usar el tipo decimal puede mitigar esto.
  • Modo Incorrecto de MidpointRounding: Asegúrate de usar el modo MidpointRounding correcto para tus requisitos específicos. El mal uso de estos modos puede dar lugar a errores de redondeo.

Cómo depurar

Utiliza herramientas como el registro y los puntos de interrupción para rastrear el valor antes y después del redondeo. Inspeccionar el valor original y los parámetros pasados al método de redondeo generalmente puede revelar inconsistencias.

Iron Suite

Después de dominar los conceptos básicos del redondeo en C#, podrías preguntarte cómo llevar tus aplicaciones al siguiente nivel, especialmente al tratar con formatos de datos complejos. La Iron Suite puede ser tu salvación aquí. Esta suite comprende herramientas poderosas como IronPDF, IronXL, IronOCR, e IronBarcode. Vamos a profundizar en cómo estas herramientas pueden integrarse con tus operaciones de redondeo y enriquecer aún más tus aplicaciones.

HierroPDF

C# Round (Cómo Funciona Para Desarrolladores) Figura 1

IronPDF es una biblioteca robusta en C# diseñada para la generación de PDF desde HTML, edición y gestión. Imagina un escenario donde necesitas generar un informe en formato PDF tras realizar operaciones de redondeo. IronPDF puede convertir sin esfuerzo tu código C# en PDFs de alta calidad.

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

C# Round (Cómo Funciona Para Desarrolladores) Figura 2

IronXL proporciona funcionalidades para trabajar con archivos Excel, permitiendo a los desarrolladores C# leer, escribir y manipular hojas de Excel sin problemas. Con IronXL, puedes recuperar datos decimales o dobles de hojas de Excel, realizar operaciones de redondeo en C#.

IronOCR

C# Round (Cómo Funciona Para Desarrolladores) Figura 3

IronOCR es una biblioteca avanzada de Reconocimiento Óptico de Caracteres (OCR) para C# que puede reconocer y extraer texto de imágenes y PDFs. Supón que tienes documentos escaneados o imágenes que contienen datos numéricos. Con IronOCR, puedes extraer estos datos, procesarlos o redondearlos en C#.

Código de barras de hierro

C# Round (Cómo Funciona Para Desarrolladores) Figura 4

IronBarcode es una herramienta poderosa para generar, leer y clasificar códigos de barras y códigos QR en .NET. En contextos donde los datos redondeados necesitan ser codificados en códigos de barras (por ejemplo, precios de productos en una aplicación minorista), IronBarcode puede ser invaluable.

Conclusión

El redondeo en C# es un tema multifacético con aplicaciones en varios dominios. Comprender los métodos integrados como método Math.Round, método Math.Floor y método Math.Ceiling, y saber cuándo usar el tipo de datos adecuado (doble o decimal) te permitirá manejar datos numéricos de manera eficiente.

Usar el redondeo en C# ayuda a que los números sean más fáciles de manejar. Pero, ¿qué pasa si quieres hacer aún más con esos números? Ahí es donde entra la [Iron Suite](Iron Suite). Es un conjunto de herramientas que pueden ayudarte a trabajar con PDFs, archivos Excel, texto en imágenes y códigos de barras.

Aquí está la parte emocionante: Puedes probar estas herramientas gratis con una licencia de prueba para ver si te gustan. Si decides comprar una, cada una cuesta una liteLicense. Pero si quieres comprar todas, puedes obtener el conjunto completo por solo dos herramientas. Es como obtener cuatro herramientas pero solo pagar por dos. Consulta la [página de licencias](Iron Suite) de Iron Suite para obtener más información.

Preguntas Frecuentes

¿Cómo puedo redondear números en C# para aplicaciones financieras?

En C#, puedes usar el método `Math.Round` con el tipo de dato `decimal` para mayor precisión en aplicaciones financieras. Se recomienda usar `MidpointRounding.AwayFromZero` para asegurar un redondeo preciso en transacciones financieras.

¿Cuál es el modo de redondeo predeterminado en C#?

El modo de redondeo predeterminado en C# es el 'redondeo del banquero', que redondea los valores media al número par más cercano usando la opción `MidpointRounding.ToEven`.

¿Cómo funciona el redondeo al convertir HTML a PDF en C#?

Al convertir HTML a PDF usando IronPDF, puedes incorporar operaciones de redondeo para datos numéricos procesando los datos en C# antes de renderizarlos en el documento PDF.

¿Puedo usar métodos de redondeo de C# para datos en archivos de Excel?

Sí, se puede usar IronXL para manipular archivos de Excel en C#, aplicando métodos de redondeo a datos numéricos dentro de las celdas usando `Math.Round` para presentar los datos con precisión.

¿Cuál es la importancia de la enumeración MidpointRounding en C#?

La enumeración `MidpointRounding` en C# proporciona opciones para redondear valores en el punto medio, tales como `AwayFromZero` y `ToEven`, permitiendo a los desarrolladores controlar cómo se aplica el redondeo a números que se encuentran exactamente entre dos enteros.

¿Cómo aplico funciones de redondeo personalizadas en C#?

Puedes crear funciones de redondeo personalizadas en C# escribiendo tu propia lógica para manejar reglas de redondeo específicas más allá del método estándar `Math.Round`, las cuales pueden integrarse con las herramientas de Iron Software para un procesamiento de datos mejorado.

¿Se pueden redondear valores de entrada de tipo cadena en C#?

Sí, las entradas de tipo cadena pueden analizarse a tipos numéricos como `double` o `decimal` en C#, permitiéndote aplicar métodos de redondeo y luego convertirlos nuevamente a cadenas para su uso posterior.

¿Cómo pueden beneficiarse herramientas como IronOCR e IronBarcode de las operaciones de redondeo?

IronOCR puede usar el redondeo para procesar datos numéricos extraídos del reconocimiento de texto, mientras que IronBarcode puede integrar valores redondeados en datos de código de barras para una codificación precisa de información numérica.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más