2009-08-04 40 views
7

Tengo una aplicación de Visual Basic que necesita redondear un número hacia abajo, por ejemplo, 2.556 se convertiría en 2.55 y no en 2.26.Redondeo de un número en Visual Basic

que pueda hacer esto utilizando una función de quitarse los caracteres más de 2 desde el punto decimal usando esto:

Dim TheString As String 
TheString = 2.556 
Dim thelength = Len(TheString) 
Dim thedecimal = InStr(TheString, ".", CompareMethod.Text) 
Dim Characters = thelength - (thelength - thedecimal - 2) 
_2DPRoundedDown = Left(TheString, Characters) 

¿Hay una mejor función para hacer esto?

Respuesta

10

Puede hacerlo con Math.Floor. Sin embargo, tendrá que multiplicar y dividir * 100, ya que no puede proporcionar un número de dígitos

Dim theNumber as Double 
theNumber = 2.556 
Dim theRounded = Math.Sign(theNumber) * Math.Floor(Math.Abs(theNumber) * 100)/100.0 
+0

Esto no funcionará si el número es negativo. – Justin

+0

A veces es beneficioso almacenar sus números como enteros, o puntos fijos (si no necesita el rango completo de coma flotante), realizar cálculos en los números de punto fijo y luego ajustarlos cuando se muestran al usuario. –

+0

@Justin: Buen punto: lo edité para dar cuenta de los números negativos, así como positivo –

3

Otra manera de hacerlo que no se basa en el uso del tipo String:

Dim numberToRound As Decimal 
Dim truncatedResult As Decimal 
numberToRound = 2.556 
truncatedResult = (Fix(numberToRound*100))/100 
+0

El uso de Fix() será un poco más rápido que usar Floor(). – Justin

+2

¿Hay algo que respalde esa afirmación? –

+1

@Justin: la reparación es en realidad más lenta que Math.Floor: realiza una comprobación y luego llama a Math.Floor internamente. Ejecute el reflector en Microsoft.VisualBasic.dll para más detalles. –

2

La respuesta Math.Floor() es buena. No estoy seguro exactamente en qué entornos VB Fix() se define. Como señala Justin, Math.Floor() no funcionará con números negativos. Tendría que tomar el valor absoluto, luego multiplicar por el SGN() del número. No sé el nombre exacto de la función que utilizarías para obtener el SiGN (no sin()) del número.

En pseudo-código, teniendo en cuenta los valores negativos, el resultado se parecería a:

result = sgn(num) * floor(abs(num * RoundToDig))/RoundToDig 

- vacas peludas moo y descomprimir.

+0

Estoy acostumbrado a la función Fix() de VB6, pero también está disponible en VB.NET - http://msdn.microsoft.com/en-us/library/microsoft.visualbasic.conversion.fix.aspx –

+0

@WyrdestGeek: la función es Math.Sign. @Saul: repara llamadas Math.Floor internamente. –

+0

¿Qué es esto de descomprimir bovinos? –

1

el redondeo por

Math.Floor(number) 

Para recortar caracteres

number.Substring(0,1) 

Puede convertirlo en cadena.

0
Dim Input As Decimal 
Dim Output As Decimal 
Input = 2.556 
Output = Input - (Input Mod 0.01) 

Esto funciona tanto con números positivos y negativos