Foros del Web » Programando para Internet » ASPX (.net) »

No hay funcion para redondear a X decimales?

Estas en el tema de No hay funcion para redondear a X decimales? en el foro de ASPX (.net) en Foros del Web. Buenas de nuevo. Estoy intentando encontrar una funcion, lo que sea, para redondear un numero que tengo de 4 0 5 decimales, a 2 decimales. ...
  #1 (permalink)  
Antiguo 23/05/2006, 04:06
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
No hay funcion para redondear a X decimales?

Buenas de nuevo.
Estoy intentando encontrar una funcion, lo que sea, para redondear un numero que tengo de 4 0 5 decimales, a 2 decimales.
La verdad, no pensé que costara tanto.
He estado investigando con string.format , pero creo que no me da la opción del nº de decimales, unicamente el formato del numero...
Mirando por la red encontré hasta esto !!
http://www.elguille.info/colabora/pu..._redondear.htm

Cosa que me sorprendió mucho. De verdad en .NET no existe algo para poder redondear un número a X decimales? Tengo que crearme una función que me haga eso?? Bueno, si no hay más tu tia lo haré, pero me cuesta mucho de creer.

Bueno. A ver si alguien sabe la instruccion, si es que existe...
Saludos.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 23/05/2006, 04:23
 
Fecha de Ingreso: abril-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 0
Buscando un poco en la ayuda de Visual Studio, lo he encontrado:

Dim d As Decimal
d = InputBox("Introduce número decimal (p.e 8,7564):")
MsgBox(Decimal.Round(d, 2))


Saludos.

Última edición por aupaneu; 23/05/2006 a las 04:32
  #3 (permalink)  
Antiguo 23/05/2006, 08:49
 
Fecha de Ingreso: abril-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 0
Buenas.

En este mismo foro he encontrado un ejemplo:

http://www.forosdelweb.com/showthrea...540#post343540

En este caso se utiliza Javascript.
  #4 (permalink)  
Antiguo 23/05/2006, 12:11
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Prueba con:
Math.Round(número, números de decimales)

Por ejemplo
Math.Round(1.2346, 1) -> 1.2
Math.Round(1.2346, 2) -> 1.23
Math.Round(1.2346, 3) -> 1.234

Un saludo.
  #5 (permalink)  
Antiguo 23/05/2006, 13:44
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Ojo con esto!!!
.Net utiliza el conocido "Redondeo del banquero". Esto quiere decir que 1.25 redondeado a un decimal debería ser 1.3, pero el redondeo del banquero lo deja en 1.2 y recién el 1.26 lo redondea en 1.3.

Hagan la prueba, personalmente tuve que desarrollar una función de redondeo para que lo hiciera como debería.

Si quieren después la paso.
__________________
saludos
seba
http://sgomez.blogspot.com
  #6 (permalink)  
Antiguo 23/05/2006, 18:52
 
Fecha de Ingreso: abril-2006
Mensajes: 166
Antigüedad: 18 años
Puntos: 0
Si utiliza mi propuesta, el 2,555 lo redondea a 2.56
  #7 (permalink)  
Antiguo 24/05/2006, 02:28
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Por lo visto en el ejemplo de Scho (el de tres decimales) parece que .Seb tiene razón...
Lo dejaré como comenta aupaneu: Decimal.Round(num, 2)

Como lo ves .Seb? No pudiste utilizar esta opción? Tuviste que desarrollarte la función en tu caso? Que es lo que tenias que hacer?

Saludos y gracias.
__________________
..:: moNTeZIon ::..
  #8 (permalink)  
Antiguo 24/05/2006, 05:11
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Rectifico mi ejemplo:
Math.Round(1.2346, 3) -> 1.235 (y no 1.234 como había puesto)

Eso sí, lo que dice .seb es cierto, el redondeo es a la baja, pero con ese ejemplo erroneo que había puesto antes daba la impresión de que lo que hacía Math.Round era truncar los decimales.

Saludos.
  #9 (permalink)  
Antiguo 24/05/2006, 05:19
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Por cierto, acabo de probar Decimal.Round y también hace un redondeo a la baja al igual que Math.Round.

En casi todos los lenguajes el redondeo suele ser al alza, que raro que .NET haya decidido hacerlo a la baja.


Un saludo
  #10 (permalink)  
Antiguo 24/05/2006, 08:38
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola Scho, no puedo compartir lo que comentas.
Hechas mis pruebas, Decimal.Round redondea "como esperamos" , y también Math.Round.
A mi ninguno de los dos me redondea a la baja...
Es seguro lo que comentas? Si es así quizá el tema se vea afectado por el sistema operativo o la region...
Alguien sabe?

Saludos.
__________________
..:: moNTeZIon ::..
  #11 (permalink)  
Antiguo 24/05/2006, 08:54
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Bueno, yo el Decimal.Round nunca lo probé, pero el Math.Round estoy seguro que redondea "mal". (según lo que yo espero que redondee)
__________________
saludos
seba
http://sgomez.blogspot.com
  #12 (permalink)  
Antiguo 24/05/2006, 09:08
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Bueno bueno, aparentemente depende si de algo configurable que todavía no sé que es.
O sea, acabo de probarlo y me funciona bien, tal cual moNTezion comenta.

Les paso el código para que cada uno lo pruebe y comente su resultado...

Código:
Console.WriteLine(Math.Round(1.15, 1));
Console.WriteLine(Decimal.Round(1.15m, 1));
//Console.WriteLine(IGA.Math.TrueRound(1.15m, 1));
Console.Read();

El output es:
1,2
1,2
__________________
saludos
seba
http://sgomez.blogspot.com
  #13 (permalink)  
Antiguo 24/05/2006, 09:35
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.

Extraido de la MSDN
__________________
saludos
seba
http://sgomez.blogspot.com
  #14 (permalink)  
Antiguo 24/05/2006, 10:22
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Toda la razón...

Math.Round(3.44, 1); //Returns 3.4.
Math.Round(3.45, 1); //Returns 3.4.
Math.Round(3.46, 1); //Returns 3.5.

Y tanto "Math.Round" como "Decimal.Round" me redondean mal al evaluar el 5.
O sea, tanto uno como el otro redondea a la baja con el numero 5, cuando deberia ser al reves... Saben el motivo?
__________________
..:: moNTeZIon ::..
  #15 (permalink)  
Antiguo 24/05/2006, 10:31
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Saludos!
Parecía que unas veces se redondeaba al alza y otras a la baja, así que he estado probando y creo que ya he resulto el "misterio".
Si el número que precede al 5 a redondear es par ó 0 se redondea a la baja, pero si es impar se redondea al alza (también se puede ver como que redondea siempre a un número par, pero da igual, la idea es la misma). He probado:

Math.Round(3.05, 1); // Se obtiene 3.0
Math.Round(3.15, 1); // Se obtiene 3.2
Math.Round(3.25, 1); // Se obtiene 3.2
Math.Round(3.35, 1); // Se obtiene 3.4
Math.Round(3.45, 1); // Se obtiene 3.4
Math.Round(3.55, 1); // Se obtiene 3.6
Math.Round(3.65, 1); // Se obtiene 3.6
Math.Round(3.75, 1); // Se obtiene 3.8
Math.Round(3.85, 1); // Se obtiene 3.8
Math.Round(3.95, 1); // Se obtiene 4.0

Es curioso, no tenía ni idea de que lo hacía así :)

Un saludo
  #16 (permalink)  
Antiguo 24/05/2006, 10:36
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Hola Scho, tengo que volver a contradecirte porqué encontré a que se debe el tema.
Es tan sencillo como que la funcion Round viene con un "Tipo de redondeo" por defecto, que precisamente es el que no interesa. Pero eso se soluciona fácilmente pasándole un tercer parámetro a la funcion Round, indicándole el tipo de redondeo.

Math.Round(3.85, 1, MidpointRounding.AwayFromZero)

Pruébenlo!
Salud
__________________
..:: moNTeZIon ::..
  #17 (permalink)  
Antiguo 24/05/2006, 10:50
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Es cierto monTeZion, también ví ese tercer parámetro, de todas formas lo que muestra Scho es muy curioso... e incoherente a la vez

A quien le puede interesar una función que redondea dependiendo si el número si "acerca" a cero o no????
__________________
saludos
seba
http://sgomez.blogspot.com
  #18 (permalink)  
Antiguo 24/05/2006, 10:53
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
No me va :(, por lo que he leído parece que sólo funciona en el framework 2.0(yo uso el 1.1.4322) aunque a lo mejor sí que funciona y me equivoco, que en este post me estoy "cubriendo de gloria" :D

Sería una pena que sólo se pudiera utilizar en el 2.0, parece bastante útil. Eso de redondear el 5 unas veces al alza y otras a la baja es un poquito raro.

Saludos!
  #19 (permalink)  
Antiguo 24/05/2006, 10:59
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Tienes razón. Pero creo que puede deberse a casualidad con los valores que ha probado. Es que no parece util para nada, eso...
El mismo que comente haciendo un par de pruebas más...

Saludos.
__________________
..:: moNTeZIon ::..
  #20 (permalink)  
Antiguo 24/05/2006, 11:17
 
Fecha de Ingreso: marzo-2004
Ubicación: Valencia
Mensajes: 367
Antigüedad: 20 años, 1 mes
Puntos: 1
Ya para zanjar el tema por mi parte, comentaros que he probado unas cuantas veces más y sigue ocurriendo lo mismo.

De todas formas (y aunque es verdad que no es demasiado útil) supongo que matemáticamente no es incorrecto. Estamos suponiendo que redondear el 5 al alza es lo correcto, pero dependiendo de la situación quizá lo correcto sería redondearlo a la baja; así que como en el framework 1.1.4322 no se puede poner un tercer parámetro para indicar que tipo de redondeo se utiliza pues se decantarían por redondearlo al alza o baja alternativamente según el número que le precede.

Bueno, muy interesante lo de ese tercer parámetro, siempre se aprenden cosas nuevas en este foro


Un saludo.
  #21 (permalink)  
Antiguo 24/05/2006, 14:18
Avatar de .seb  
Fecha de Ingreso: marzo-2006
Ubicación: Uruguay
Mensajes: 493
Antigüedad: 18 años, 1 mes
Puntos: 1
Así es, y ya que estoy confirmo que solo en .net 2.0 viene ese tercer parámetro.
En .net 1.x no lo había y cada uno debía creau su función si quería redondear "a la baja".
Por si a alguien le sirve pego la clase que yo cree para obtener este tipo de redondeo. La forma de llamarla aparece mas arriba en mi post anterior de código.

Código:
using System;

namespace IGA
{
	/// <summary>
	/// Summary description for Math.
	/// </summary>
	public class Math
	{

		/// <summary>
		/// Redondea como es debido, del 5 al 9, al decimal siguiente
		/// </summary>
		public static decimal TrueRound(decimal number,int places)
		{
			string strNumber = number.ToString();
			int intDot = strNumber.IndexOf(".");
			int intLength = strNumber.Length;

			int intDecimals = intLength - (intDot + 1);

			if (places >= intDecimals)
				return number;

			string strNum = number.ToString().Substring(intDot + places + 1);
			if (strNum == "5")
			{
				string strSum = "0.";
				for(int i = 0; i < places; i++)
				{
					strSum += "0";
				}
				strSum += "1";
				decimal decSum = Convert.ToDecimal(strSum);
				number = number + decSum;
			}

			return System.Math.Round(number,places);
		}
	}
}
__________________
saludos
seba
http://sgomez.blogspot.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:54.