Problemas con redondeo...

03/05/2006 - 22:17 por GustavoArriola | Informe spam
Hola a todos!

Tengo un procedimiento que realiza el redondeo por medio de la espacio
system.math, también tengo otro que llama a un procedimiento almacenado en
SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
redondeo entre ambos es diferente.

¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
¿Tendré que crear mi propia rutina de redondeo?

Redondeo SQL Redondeo VB.NET
4.4 -- 4 4.4 '4
4.5 --5 4.5 '4
4.6 --5 4.6 ' 5

Desde ya muchas gracias!
Gustavo Arriola

Preguntas similare

Leer las respuestas

#1 Angel. E. Ruiz. P
03/05/2006 - 22:29 | Informe spam
Amigo la solucion es a pie lo tengo en c# te dejo como tarea transformarla a
vb .net .)


public class VVMath

{

/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static float Round(float numToRound, int numOfDec)

{

return (float)Round((decimal)numToRound, numOfDec);

}

/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static double Round(double numToRound, int numOfDec)

{

return (double)Round((decimal)numToRound, numOfDec);

}


/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static decimal Round(decimal numToRound, int numOfDec)

{

if (numOfDec < 0)

{

throw new ArgumentException("BetterMath.Rounding:" +

" Number of decimal places must be 0 or greater",

"numOfDec");

}

decimal num = numToRound;

//Shift the decimal to the right the number

//of digits they want to round to

for (int i = 1; i <= numOfDec; i++)

{

num *= 10;

}

//Add/Subtract .5 to TRY to increase the number

//that is to the LEFT of the decimal

if (num < 0)

{

num -= .5M;

}

else

{

num += .5M;

}

//Cut off the decimal, you have your answer!

num = (decimal)((int)num);

//Shift the decimal back into its proper position

for (int i = 1; i <= numOfDec; i++)

{

num /= 10;

}

return num;

}

}


Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"
"GustavoArriola" escribió en el mensaje
news:
Hola a todos!

Tengo un procedimiento que realiza el redondeo por medio de la espacio
system.math, también tengo otro que llama a un procedimiento almacenado en
SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
redondeo entre ambos es diferente.

¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
¿Tendré que crear mi propia rutina de redondeo?

Redondeo SQL Redondeo VB.NET
4.4 -- 4 4.4 '4
4.5 --5 4.5 '4
4.6 --5 4.6 ' 5

Desde ya muchas gracias!
Gustavo Arriola

Respuesta Responder a este mensaje
#2 Jorge Serrano [MVP VB]
04/05/2006 - 08:42 | Informe spam
Por simplificar.

Esta es la conversión automática que he sacado del código de Ángel por si
alguien quiere probarla.

Public Class VVMath
'/ <summary>
'/ Realiza el redondeo utilizado el metodo asymetrico artimetrico
'/ 2.45 = 2.5
'/ </summary>
'/ <param name="numToRound"></param>
'/ <param name="numOfDec"></param>
'/ <returns></returns>
Overloads Public Shared Function Round(numToRound As Single, numOfDec As
Integer) As Single
Return CSng(Round(CDec(numToRound), numOfDec))
End Function 'Round

'/ <summary>
'/ Realiza el redondeo utilizado el metodo asymetrico artimetrico
'/ 2.45 = 2.5
'/ </summary>
'/ <param name="numToRound"></param>
'/ <param name="numOfDec"></param>
'/ <returns></returns>
Overloads Public Shared Function Round(numToRound As Double, numOfDec As
Integer) As Double
Return CDbl(Round(CDec(numToRound), numOfDec))
End Function 'Round

'/ <summary>
'/ Realiza el redondeo utilizado el metodo asymetrico artimetrico
'/ 2.45 = 2.5
'/ </summary>
'/ <param name="numToRound"></param>
'/ <param name="numOfDec"></param>
'/ <returns></returns>
Overloads Public Shared Function Round(numToRound As Decimal, numOfDec As
Integer) As Decimal
If numOfDec < 0 Then
Throw New ArgumentException("BetterMath.Rounding:" + " Number of
decimal places must be 0 or greater", "numOfDec")
End If
Dim num As Decimal = numToRound
'Shift the decimal to the right the number
'of digits they want to round to
Dim i As Integer
For i = 1 To numOfDec
num *= 10
Next i
'Add/Subtract .5 to TRY to increase the number
'that is to the LEFT of the decimal
If num < 0 Then
num -= 0.5D
Else
num += 0.5D
End If
'Cut off the decimal, you have your answer!
num = CDec(CInt(num))
'Shift the decimal back into its proper position
Dim i As Integer
For i = 1 To numOfDec
num /= 10
Next i
Return num
End Function 'Round
End Class 'VVMath


Un saludo.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/


"Angel. E. Ruiz. P" wrote:

Amigo la solucion es a pie lo tengo en c# te dejo como tarea transformarla a
vb .net .)


public class VVMath

{

/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static float Round(float numToRound, int numOfDec)

{

return (float)Round((decimal)numToRound, numOfDec);

}

/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static double Round(double numToRound, int numOfDec)

{

return (double)Round((decimal)numToRound, numOfDec);

}


/// <summary>

/// Realiza el redondeo utilizado el metodo asymetrico artimetrico

/// 2.45 = 2.5

/// </summary>

/// <param name="numToRound"></param>

/// <param name="numOfDec"></param>

/// <returns></returns>

public static decimal Round(decimal numToRound, int numOfDec)

{

if (numOfDec < 0)

{

throw new ArgumentException("BetterMath.Rounding:" +

" Number of decimal places must be 0 or greater",

"numOfDec");

}

decimal num = numToRound;

//Shift the decimal to the right the number

//of digits they want to round to

for (int i = 1; i <= numOfDec; i++)

{

num *= 10;

}

//Add/Subtract .5 to TRY to increase the number

//that is to the LEFT of the decimal

if (num < 0)

{

num -= .5M;

}

else

{

num += .5M;

}

//Cut off the decimal, you have your answer!

num = (decimal)((int)num);

//Shift the decimal back into its proper position

for (int i = 1; i <= numOfDec; i++)

{

num /= 10;

}

return num;

}

}


Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"
"GustavoArriola" escribió en el mensaje
news:
> Hola a todos!
>
> Tengo un procedimiento que realiza el redondeo por medio de la espacio
> system.math, también tengo otro que llama a un procedimiento almacenado en
> SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
> redondeo entre ambos es diferente.
>
> ¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
> ¿Tendré que crear mi propia rutina de redondeo?
>
> Redondeo SQL Redondeo VB.NET
> 4.4 -- 4 4.4 '4
> 4.5 --5 4.5 '4
> 4.6 --5 4.6 ' 5
>
> Desde ya muchas gracias!
> Gustavo Arriola
>



Respuesta Responder a este mensaje
#3 Jorge Serrano [MVP VB]
04/05/2006 - 08:53 | Informe spam
Hola Gustavo,

el problema del redondeo es que se puede redondear por la izquierda o por la
derecha.

La función ROUND que será supongo la que usas en SQL Server, redondea de una
manera por defecto.

Lo mismo ocurre con .NET.

Mi consejo es que mires la ayuda para aprender más acerca de la función de
redondeo de SQL Server que empleas en un Stored Procedure y que hagas lo
mismo en el código de .NET.

En VB 2005 por ejemplo, emplear:
Math.Round(4.5, MidpointRounding.ToEven) daría como resultado 4
mientras que:
Math.Round(4.5, MidpointRounding.AwayFromZero) daría como resultado 5
(Creo que en versiones anteriores de .NET esto no cambia)

En SQL Server creo recordar que la función ROUND funciona igual.
Deberías ajustarlas en ambos casos, en .NET y en SQL Server.

En SQL Server creo que la definición de ROUND dice que se debe emplear como
ROUND(m,n). Si n<0 el redondeo se efectua por la izquierda del punto decimal
que creo que sería tu caso, ya que intuyo que redondeas como ROUND(m)
directamente, por lo que n es cero por defecto que es el redondeo por defecto
que se realiza.

Espero que mis comentarios te sirvan.

Un saludo.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/


"GustavoArriola" wrote:

Hola a todos!

Tengo un procedimiento que realiza el redondeo por medio de la espacio
system.math, también tengo otro que llama a un procedimiento almacenado en
SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
redondeo entre ambos es diferente.

¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
¿Tendré que crear mi propia rutina de redondeo?

Redondeo SQL Redondeo VB.NET
4.4 -- 4 4.4 '4
4.5 --5 4.5 '4
4.6 --5 4.6 ' 5

Desde ya muchas gracias!
Gustavo Arriola



Respuesta Responder a este mensaje
#4 Angel. E. Ruiz. P
04/05/2006 - 15:10 | Informe spam
Jorge pero
MidpointRounding Enumeration This enumeration is new in the .NET Framework
version 2.0.

Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"
"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
Hola Gustavo,

el problema del redondeo es que se puede redondear por la izquierda o por
la
derecha.

La función ROUND que será supongo la que usas en SQL Server, redondea de
una
manera por defecto.

Lo mismo ocurre con .NET.

Mi consejo es que mires la ayuda para aprender más acerca de la función de
redondeo de SQL Server que empleas en un Stored Procedure y que hagas lo
mismo en el código de .NET.

En VB 2005 por ejemplo, emplear:
Math.Round(4.5, MidpointRounding.ToEven) daría como resultado 4
mientras que:
Math.Round(4.5, MidpointRounding.AwayFromZero) daría como resultado 5
(Creo que en versiones anteriores de .NET esto no cambia)

En SQL Server creo recordar que la función ROUND funciona igual.
Deberías ajustarlas en ambos casos, en .NET y en SQL Server.

En SQL Server creo que la definición de ROUND dice que se debe emplear
como
ROUND(m,n). Si n<0 el redondeo se efectua por la izquierda del punto
decimal
que creo que sería tu caso, ya que intuyo que redondeas como ROUND(m)
directamente, por lo que n es cero por defecto que es el redondeo por
defecto
que se realiza.

Espero que mis comentarios te sirvan.

Un saludo.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/


"GustavoArriola" wrote:

Hola a todos!

Tengo un procedimiento que realiza el redondeo por medio de la espacio
system.math, también tengo otro que llama a un procedimiento almacenado
en
SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
redondeo entre ambos es diferente.

¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
¿Tendré que crear mi propia rutina de redondeo?

Redondeo SQL Redondeo VB.NET
4.4 -- 4 4.4 '4
4.5 --5 4.5 '4
4.6 --5 4.6 ' 5

Desde ya muchas gracias!
Gustavo Arriola



Respuesta Responder a este mensaje
#5 Jorge Serrano [MVP VB]
04/05/2006 - 15:52 | Informe spam
Hola Ángel,

efectivamente es de .NET 2.0.

En la explicación indicaba que estaba utilizando VB 2005.

Pero mejor así que quede la aclaración una vez más por si acaso. :-)))

Muchas gracias por el comentario.

Un abrazo.

Jorge Serrano Pérez
Microsoft MVP VB.NET
PortalVB.com
http://www.portalvb.com/
Weblog de Jorge Serrano
http://weblogs.golemproject.com/jorge/


"Angel. E. Ruiz. P" wrote:

Jorge pero
MidpointRounding Enumeration This enumeration is new in the .NET Framework
version 2.0.

Saludos cordiales,
Ángel Ruiz
MCP C#
MVP de Visual Basic desde 2004
Caracas - Venezuela
"El conocimiento es un bien, que crece a medida que se comparte"
"Jorge Serrano [MVP VB]"
escribió
en el mensaje news:
> Hola Gustavo,
>
> el problema del redondeo es que se puede redondear por la izquierda o por
> la
> derecha.
>
> La función ROUND que será supongo la que usas en SQL Server, redondea de
> una
> manera por defecto.
>
> Lo mismo ocurre con .NET.
>
> Mi consejo es que mires la ayuda para aprender más acerca de la función de
> redondeo de SQL Server que empleas en un Stored Procedure y que hagas lo
> mismo en el código de .NET.
>
> En VB 2005 por ejemplo, emplear:
> Math.Round(4.5, MidpointRounding.ToEven) daría como resultado 4
> mientras que:
> Math.Round(4.5, MidpointRounding.AwayFromZero) daría como resultado 5
> (Creo que en versiones anteriores de .NET esto no cambia)
>
> En SQL Server creo recordar que la función ROUND funciona igual.
> Deberías ajustarlas en ambos casos, en .NET y en SQL Server.
>
> En SQL Server creo que la definición de ROUND dice que se debe emplear
> como
> ROUND(m,n). Si n<0 el redondeo se efectua por la izquierda del punto
> decimal
> que creo que sería tu caso, ya que intuyo que redondeas como ROUND(m)
> directamente, por lo que n es cero por defecto que es el redondeo por
> defecto
> que se realiza.
>
> Espero que mis comentarios te sirvan.
>
> Un saludo.
>
> Jorge Serrano Pérez
> Microsoft MVP VB.NET
> PortalVB.com
> http://www.portalvb.com/
> Weblog de Jorge Serrano
> http://weblogs.golemproject.com/jorge/
>
>
> "GustavoArriola" wrote:
>
>> Hola a todos!
>>
>> Tengo un procedimiento que realiza el redondeo por medio de la espacio
>> system.math, también tengo otro que llama a un procedimiento almacenado
>> en
>> SQL Server 2000 que también realiza un redondeo. Sin embargo la forma de
>> redondeo entre ambos es diferente.
>>
>> ¿Cómo puedo hacer para que el redondeo en vb.net coincida con el de SQL?
>> ¿Tendré que crear mi propia rutina de redondeo?
>>
>> Redondeo SQL Redondeo VB.NET
>> 4.4 -- 4 4.4 '4
>> 4.5 --5 4.5 '4
>> 4.6 --5 4.6 ' 5
>>
>> Desde ya muchas gracias!
>> Gustavo Arriola
>>
>>
>>



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida