Conversión de decimal con parte fraccionaria en C

C – Convertir decimal con parte fraccionaria

En este post de programación en ANSI C te mostraré 3 conversiones entre bases numéricas: de decimal a binario, a octal y a hexadecimal. La diferencia con mis otros posts es que en este caso vamos a convertir también la parte fraccionaria, decimal o como le llames a lo que va después del punto decimal.

Entonces vamos a convertir entre binario y decimal con punto decimal, además de convertir a octal, hexadecimal y a todas las otras bases.

Así que al final, con el código que te mostraré, podrás convertir números en base 10 con parte fraccionaria a cualquier base. Por ejemplo, convertir 3722.24 base 10 a E8A.3D70 base 16.

Te repito que la principal diferencia es que ahora este conversor en C soporta conversiones con punto decimal, cosa que me habían solicitado varios usuarios en mis otros posts.

Explicación del algoritmo

Para entender cómo funciona este algoritmo debemos entender la forma manual de hacer la conversión. Para este ejemplo convertiré el número a hexadecimal (pero esto que te muestro igual funciona con base 2 y base 8), así que tenemos 3722.24 como entrada.

Presta atención en que la base es 16, y los dígitos de la misma son 0123456789ABCDEF.

Lo primero que hacemos es separar la parte entera y la parte fraccionaria, para ello podemos usar modf. Ahora trabajamos con las partes por separado.

Parte entera

En el caso de la parte entera vamos dividiendo entre 16 y obteniendo el residuo de la división. Cada valor de residuo irá conformando la cadena hexadecimal. El proceso va así:

Y hasta este momento tenemos la parte entera ya en hexadecimal que equivale a E8A. Fíjate en que el proceso se detiene cuando la parte entera es 0.

Parte fraccionaria

En este caso vamos a multiplicar la parte fraccionaria por 16 y tomar el valor entero del resultado para agregarlo al final de la cadena hexadecimal.

Ahora la parte fraccionaria igualmente se toma del resultado anterior, y se repite el proceso hasta que el sobrante sea 0. El proceso es así:

Y la parte fraccionaria como hexadecimal es 3D70. Por lo que el número completo ya convertido es: E8A.3D70.

Esto mismo que aplicamos aquí se va a aplicar para la conversión de decimal a octal y decimal a binario con parte fraccionaria, solo vamos a cambiar la base y los dígitos que la conforman.

Función general para la conversión

Anteriormente había creado una función para cada conversión, pero me di cuenta de que se puede crear una función que proporciona un método de conversión desde decimal a cualquier otra base.

Sin más preámbulo, te la muestro. En los comentarios se explica el funcionamiento:

Los métodos que no son para el cálculo son para trabajar con cadenas o para invertirlas.

En este caso esta función soporta conversión de números con fracción desde la base 10 a binario, octal y hexadecimal. No devuelve nada, pues coloca el resultado en la cadena que se proporciona al llamarla. Ahora es momento de ver su modo de uso.

Antes que nada debemos declarar el número que se va a convertir y la cadena en donde se almacenará el resultado de la conversión:

Obviamente el número puede venir de cualquier lugar o puedes declararlo tú mismo.

Decimal a hexadecimal

Comenzando con el caso del ejemplo, para hacer la conversión invocamos a la función que la base es 16 con los dígitos adecuados:

Decimal a octal

Lo mismo que anteriormente, solo que ahora los dígitos van del 0 al 7 y la base es 8:

Decimal a binario

Para terminar el ejemplo, también podemos convertir de decimal a binario:

De hecho con esta función podemos convertir a cualquier otra base siempre y cuando indiquemos los dígitos.

Poniendo todo junto

Conversión de decimal con parte fraccionaria en C
Conversión de decimal con parte fraccionaria en C

Es momento de ver el código en lenguaje C completo, así como el método main. Todo queda así:

Si quieres puedes ejecutar el código aquí. En mi caso funciona perfectamente.

Nota: he probado con otras calculadoras y en ocasiones el método presentado aquí no es tan preciso para la parte fraccionaria. Esto es porque me basé en el método manual para la conversión. Recuerda que igualmente eres libre de mejorar el código.

Te dejo más entradas sobre C en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario