Convertir Decimal A Fracción


Objetivo: Convertir Decimal A Fracción
Hola colegas,

se me presento un caso en una pequeña fabrica en la que se necesitaba
expresar los resultados de algunos cálculos en formato de fracción, pero
como sabemos gambas no escribe en facción y creo que ningún otro lenguaje,
así que escribí una función que permite introducir EJ: 0.8125 y devuelve 13/16

adjunto la función. espero a alguien le sea de utilidad

PUBLIC FUNCTION Cfraccion(Cadena AS String) AS String 'Convierte decimal a fraccion
DIM tm AS Byte 'tamaño del decimal
DIM m AS Single 'maximo comun divisor
DIM k AS Single 'multiplicador
DIM n AS Single 'numerador
DIM d AS Single 'denominador
DIM n1 AS Single 'numerador experimental
DIM d1 AS Single 'denominador experimental
DIM f AS String
DIM final AS String

f = Frac(Cadena)
tm = Len(f) - 2

IF tm = 1 THEN k = 10
IF tm = 2 THEN k = 100
IF tm = 3 THEN k = 1000
IF tm = 4 THEN k = 10000

n = k * Frac(Cadena)
d = k * 1

FOR m = k TO 1 STEP -1
n1 = n / m
d1 = d / m

IF Len(CStr(Frac(n1))) <= 1 AND Len(CStr(Frac(d1))) <= 1 THEN
m = 1
final = n1 & "/" & d1
ENDIF
NEXT

RETURN final
END

Perfil MP  
Objetivo: Re: Convertir Decimal A Fracción
Interesante ... gracias por la aportacion

Objetivo: Re: Convertir Decimal A Fracción
Hola Alessandri:

Podrías ahorrar un poco de código:
Yo lo hice así.Fíjate en la conversión que hace en la variable denominador.

PUBLIC FUNCTION DecAFrac(decimal AS Float) AS String
DIM numerador AS Float
DIM denominador AS Float
DIM mcd AS Integer
DIM n AS Integer

'Añadimos detras de 1 tantos ceros como decimales tenga el número
denominador = "1" & String$(Len(CStr(Frac(decimal))) - 2, "0")

numerador = decimal * denominador

FOR n = 2 TO numerador
IF (CInt(numerador) MOD n = 0) AND (CInt(denominador) MOD n = 0) THEN mcd = n
NEXT

IF mcd <> 0 THEN
numerador = numerador / mcd
denominador = denominador / mcd
ELSE
PRINT "No se puede simplificar"
ENDIF
RETURN (numerador & "/" & denominador)

END


Pero, no hemos pensado cuando un número es periódico puro.Imagina el caso de 0,33

0,33/1
Multiplicamos por 3
0,99/3

¿ No podríamos decir que 0,99 es casi 1 ?
Osea:
1/3

Seria discutible.

Saludos.

Objetivo: Re: Convertir Decimal A Fracción
Hola!.

Aun se puede mejorar un poco más el algoritmo para encontrar su mcd en menos pasos que hacer un bucle hasta el número mayor.

El algoritmo de Euclides dice:

mcd de (dividendo y divisor) = mcd de (divisor y resto)



PUBLIC FUNCTION mcd(a AS Integer, b AS Integer) AS Integer
DIM r AS Integer
DIM aux AS Integer

IF a < b THEN
aux = a
a = b
b = aux
ENDIF

DO WHILE b <> 0
r = a MOD b
a = b
b = r
LOOP
RETURN a

END


Tenemos que tener en cuenta que el valor devuelto pudiera ser 1 con lo que no tendría un mcd.

Saludos.

última edición por Shell el Viernes, 13 Abril 2012, 09:59; editado 1 vez
Objetivo: Re: Convertir Decimal A Fracción
hola,
gracias colegas, voy a integrar todas esas mejoras que me han propuesto

gracias.

Perfil MP  

Página 1 de 1


  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario

   

Está utilizando la versión (Lo-Fi). Para ver la versión completa del foro, haga clic aquí.

Powered by Icy Phoenix based on phpBB
Design by DiDiDaDo

Página generada en:: 0.4353s (PHP: -73% SQL: 173%)
Consultas SQL: 45 - Debug off - GZIP Activado