¿Cómo redondear con dos decimales para que el resultado sea 0 o 5?

Estoy intentando realizar un redondeo con dos decimales en un campo calculado de un informe de access 2007, de la siguiente manera:

0.01 y 0.02 = 0 ; ejemplo: 0.21 sería = 0.20 (redondeo al cero inferior)

0.03, 0.04, 0.05, 0.06 y 0.07 =5 ; ejemplo: 1.53 sería = 1.55

0.08 y 0.09 =0 ; ejemplo: 1.78 sería = 1.80 (redondeo al cero superior)

La solución por la que he optado aunque no es la mejor es la siguiente:

=SiInm(Der([campo];1)=0;[campo]

;SiInm(Der([campo];1)=1;[campo]-0,01

;SiInm(Der([campo];1)=2;[campo]-0,02

;SiInm(Der([campo];1)=3;[campo]+0,02

;SiInm(Der([campo];1)=4;[campo]+0,01

;SiInm(Der([campo];1)=5;[campo]

;SiInm(Der([campo];1)=6;[campo]-0,01

;SiInm(Der([campo];1)=7;[campo]-0,02

;SiInm(Der([campo];1)=8;[campo]+0,02

;SiInm(Der([campo];1)=9;[campo]+0,01)))))))))

El problema lo tengo con el cero ya que la función Derecha no lo lee y detecta el último número distinto de cero por lo que me realiza un cálculo incorrecto.

3 Respuestas

Respuesta
1

Si bien tienes la función Round, no la necesitas para nada. Tampoco necesitas el Si...,

Basta con que en las propiedades del cuadro de texto donde te va a aparecer el resultado, en la solapa Formato-Formato la pongas como en la imagen y en los decimales pongas 2. El propio sistema ya te redondea, dependiendo el resultado, en más o en menos.

Voy a decirle que me sume el texto D + el textoE y que el resultado lo ponga en Texto F

Es decir, en Lugares decimales tienes que decirle cuántos quieres que muestre.

Respuesta
2

La respuesta que le da Gustavo es muy acertada. No obstante, si quiere manejarlo como texto esta función también sirve, pero insisto la respuesta que le da Gustavo es la mejor.

Public Function redondeo_x(dbnumero As Variant) As String

Dim tem As Variant
tem = Right(Str(dbnumero), 1)
Select Case tem
Case 1, 2
redondeo_x = Format(mid(dbnumero, 1, 3) & "0", "0.00")
Case 3, 4, 5, 6, 7
redondeo_x = Format(mid(dbnumero, 1, 3) & "5", "0.00")
Case 8, 9
redondeo_x = Format(Round(dbnumero, 1) & "0", "0.00")
End Select
End Function

Ejemplo de llamada:

¿

? Redondeo_x(2.79) retorna 2,80.

¿

? Redondeo_x(0.74) retorna 0,75

Pero tenga presente que retorna una cadena.

Muchas gracias por vuestras respuestas tan rápidas. Está claro que me compliqué la vida innecesariamente.

En cuanto a la respuesta de Julián, ya había probado a modificar las propiedades del campo pero aún así el resultado que salía no era el esperado.

La respuesta de Eduardo no la he probado porque con la respuesta de Gustavo me ha funcionado perfectamente y además el tema de la programación no lo llevo nada bien.

Sólo una cosa más. A la cantidad redondeada tengo que aplicarle un descuento y necesito que ese descuento salga redondeado de la misma manera ¿es posible?

Aprovechando la excelente respuesta de Gustavo, le preparé esta función.

Grabe esta función en un módulo, así la puede llamar desde cualquier parte.

Public Function ajustecentesima(dbvalor As Double, Optional dbdescuento As Integer) As Double

'función para ajustar centena valor neto o con descuento
'Parámetros:
' dbvalor -----Valor sin descuento
' dbdescuento ------ Valor del descuento como entero eje. 10 para el 10%. Es opcional
'Ejemplo de llamada:
' ajustecentesima(100.78) --- Sin descuento .. retorna 100.8
' ajustecentesima(100.78,10) --- Con descuento del 10% -- retorna 90.7
Dim dbtem As Double
Dim dbcondescto As Double
If dbdescuento = 0 Then
   ajustecentesima = Round(dbvalor / 5, 2) * 5
Else
  dbtem = Round(dbvalor / 5, 2) * 5
  dbcondescto = dbtem * (1 - dbdescuento / 100)
  ajustecentesima = Round(dbcondescto / 5, 2) * 5
End If
End Function

Si el descuento tiene decimales cambie la primera línea por :

Public Function ajustecentesima(dbvalor As Double, Optional dbdescuento As Double) As Double

Hola Eduardo. 

Aunque la respuesta de Gustavo me resuelve el problema quisiera poner en práctica la tuya pero a pesar de tus esfuerzos al dejarme el módulo listo para usar, algo he debido hacer mal porque no me sale bien.

Te amplío información por si me puedes dejar el módulo más fácil todavía si es que es posible.

dbvalor = RA (es el campo calculado con decimales a partir del cual se realiza el redondeo y el descuento).

dbdescuento = 50 (50% es el descuento que aplicaré aunque en otros campos aplicaré otros descuentos, crearía un módulo para cada uno de los descuentos a aplicar.

Para realizar la llamada, entiendo que debería incluir en la pestaña Datos del campo a calcular lo siguiente: =ajustecentesima([RA])

Entiendo que primero se realiza el descuento y sobre este valor se aplica el redondeo.

Por ejemplo, si tengo un valor de 100.68 y tiene un descuento del 50%, tendríamos que aplicar el redondeo sobre 50.34. Llamaría la función así:

=Ajustecentesima(100.68,50) y tendríamos 50.35. Esta es la nueva función:

Se me olvidó decirle que no tiene porque crear un módulo por cada % para esta la función, le permite pasar los 2 parámetros, valor sin descuento y el porcentaje de descuento, sino hay descuento pase un solo parámetro o deje como descuento 0 (cero). Por ejemplo,

=ajustecentesima(100.78,0) retorna 100.80

Correcto, primero se realiza el descuento y luego se redondea pero el redondeo debe realizarse para sólo 2 decimales y observo que se realiza con 3 o más decimales. ¿Es posible extraer esos dos decimales, realizar el descuento y luego el redondeo?

El redondeo esta para 2 decimales. Puede enviarme un ejemplo y reviso.

Por ejemplo, para el 50% de 1.35, obtengo: 0.675

Opción 1: Si realizo el redondeo sobre 0.675, obtengo 0.70

Opción 2: Si extraigo los dos primeros decimales, o sea 0.67, el redondeo resultante sería de 0.65

Lo que busco es el redondeo sobre la segunda opción.

Prueba con esta función

Public Function ajustecentesima(dbvalor As Double, Optional dbdescuento As Double) As Double

'función para ajustar centena valor neto o con descuento
'Parámetros:
' dbvalor -----Valor sin descuento
' dbdescuento ------ Valor del descuento como entero eje. 10 para el 10%. Es opcional
'Ejemplo de llamada:
' ajustecentesima(100.78) --- Sin descuento .. retorna 100.8
' ajustecentesima(1.35,50) --- Con descuento del 50% -- retorna 0,65
Dim dbcondescto As Double
Stop
If dbdescuento = 0 Then
ajustecentesima = Round(dbvalor / 5, 2) * 5
Else
dbcondescto = Int((dbvalor * (1 - dbdescuento / 100)) * 100) / 100
ajustecentesima = Round(dbcondescto / 5, 2) * 5
End If
End Function

Ahora está perfecto, muchas gracias, sólo una cosa más. Me comentaste que podía utilizar un mismo módulo para aplicar diferentes porcentajes o no aplicar ninguno. En realidad en algunos campos tengo que aplicar el 50%, en otros el 40%, en otros el 20% y en otros el 25%, ¿Podrías ponerme un ejemplo de como incluir estos porcentajes en el módulo?

La función es muy clara tiene 2 parámetros, el primero es el valor y el segundo es el porcentaje, por ejemplo si va a redondear 1.45 con descuento del 40% llama la función así:

Ajustecentesima(1.45,40)

Para descuento del 20%:

Ajustecentesima(1.45,20)

Si no va aplicar ninguno sería:

Ajustecentesima(1.45) ó ajustecentesima(1.45,0)

Es decir la función debe crearla en un módulo, como es pública la puede llamar desde cualquier parte, esto es formulario o informes.

Respuesta
1

Por lo que entiendo de tus ejemplos, lo que quieres es que se redondeen a múltiplos de 5 las centésimas, así sería algo como:

0.00

0.05

0.10

0.15

Etc

No es necesario los IF ni nada de eso, directamente prueba con:

Round([Campo]/5;2)*5

Salu2

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas