En este post de programación en Python te mostraré cómo convertir un número decimal en base 10 con parte fraccionaria a cualquier otra base; para el ejemplo te mostraré cómo convertir a la base 2 (binario), base 8 (octal) y base 16 (hexadecimal).

La diferencia con otros posts que te he mostrado es que ahora vamos a soportar números con punto decimal, parte fraccionaria o como le llames, y no solo números enteros.

Por ejemplo, podremos convertir el número decimal 3722.24 a E8A.3D70 en hexadecimal, usando Python.

Explicación del algoritmo

Debemos separar la parte entera y decimal, algo que podemos hacer con modf en Python. Luego debemos seguir el procedimiento que hacemos manualmente:

En el caso de la parte entera vamos dividiéndola entre la base y usando el residuo para saber cuál digito irá en el resultado.

Para la parte decimal o fraccionaria, vamos a ir multiplicando el valor decimal por la base, usar la parte entera del resultado como dígito para el resultado, y asignando la parte decimal a la parte fraccionaria original.

Todo esto que te explico está mejor explicado en el post del mismo tema pero en lenguaje C; te invito a darle un vistazo.

Código de la función

He encerrado el comportamiento de la conversión en una función de Python. Esto nos va a servir para convertir cualquier decimal con punto decimal a binario, octal y hexadecimal.

Ya te lo dije varias veces pero te lo repito: gracias a esto podremos convertir también la parte fraccionaria. Aquí el código:

Los comentarios explican el funcionamiento del método, pero básicamente recibe el número decimal que vamos a convertir, la base a la que vamos a convertir (por ejemplo, 2 para binario, 16 para hexadecimal, etcétera) y los dígitos que componen a la base.

Modo de uso

Ahora te mostraré cómo usarla. Voy a convertir el mismo número a las 3 bases más usadas, aunque teóricamente se podría convertir a cualquier base.

Poniendo todo junto

Python - Convertir número con punto decimal a binario, octal, hexadecimal y cualquier base

Python – Convertir número con punto decimal a binario, octal, hexadecimal y cualquier base

El código completo queda así, siéntete libre de modificarlo o mejorarlo. Recuerda que los datos de entrada pueden venir de cualquier lugar, aquí los estoy definiendo dentro del código por simplicidad.

Si quieres puedes probarlo en este enlace, o leer más sobre Python en mi blog.


Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome o realizando una donación.

Suscribir por correo

Ingresa tu correo y recibirás mis últimas entradas sobre programación, open source, bases de datos y todo lo relacionado con informática

Únete a otros 4,274 suscriptores


parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

1 Comentario

Victor · febrero 3, 2022 a las 5:14 pm

El código funciona muy bien y tiene la ventaja de servir para cualquier base.
PERO tiene un error en la linea 34, en vez de comparar con el sobrante (parte entera del resultado de parte_fraccionaria*base), debería verificar cuando la parte fraccionaria sea 0.
Porque de hecho en el ejemplo que esta usando 4722.24, no muestra nada de la parte fraccionaria en binario, porque apenas se encuentra un cero ya se detiene.
Solo habria que cambiar el if sobrante == 0 por el if parte_partefraccionario ==0.

PERO esto da un problema de que en algunos numeros puede ser infinito el patron de la parte fraccionaria, por eso deberia ponerse un limite.

puede ser añadirle una variable “precision” asi:
if parte_fraccionaria == 0 or i >= precision:

En conclusión quedaría algo como esto:

sobrante = None
i = 1
precision = 10
# Un do while
while True:
resultado = parte_fraccionaria*base
parte_fraccionaria, sobrante = modf(resultado)
digito = digitos[int(sobrante)]
cadena_parte_fraccionaria += digito
if parte_fraccionaria == 0 or i >= precision:
break
i += 1
return cadena_parte_entera + “.” + cadena_parte_fraccionaria

Resultado:
El decimal 4722.24 es 1001001110010.0011110101 en binario, 11162.1727024365 en octal y 1272.3D70A3D70A en hexadecimal

Deja un comentario

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada.

A %d blogueros les gusta esto: