Como dar formato a un WriteLn que contiene un numero con coma flotante en Pascal

Durante estos días he estado practicando con Pascal y ayer estuve haciendo un programilla que calcula el área de un triangulo, y mientras lo hacía me encontré con un problema. La cosa es que, obviamente, el área del triangulo que devuelve el programa es un número real, osea que tenga decimales, lo que se traduce a la programación como un número con coma flotante (más concretamente dentro ya de Pascal, de tipo ‘real’, ‘double’ o ‘extended’, dependiendo de la magnitud de los números que esperemos obtener).

El problema es que cuando mediante la función de salida por pantalla estandar (‘writeln()’, es parecida a ‘puts()’ en C) hacemos que se escriba en pantalla esa variable que contiene el resultado de tipo flotante nos lo muestra en notación científica, pero no esa que todos aprendimos en primaria, no, algo como ‘2,2346634E-34’ (sí, se que es parecida en realidad).

writeln('El area del triangulo es: ',res);

Siendo ‘res’ la variable que contiene el resultado de la operación con coma flotante. Yo estaba haciendo un programa sencillo y no quería que hasta el número decimal más sencillo me hiciese sacar la calculadora para ver cuanto era, así que me puse a investigar por el internete, y ví que más gente tenía este problema así que por eso traigo aquí esta entrada. La primera conclusión a la que llegué es que se puede solucionar poniendo:

writeln('El area del triangulo es: ',res:0:15);

Esto lo que hace es que se muestre el número, ya sin notación científica, con un mínimo de cero dígitos en el lado entero de la coma y con exactamente diez dígitos en el lado decimal. Para que entendáis como funciona os voy a poner un par de ejemplos:

//Esto hace que haya mínimo 10 digitos delante de la coma y exactamente 10 detras:
writeln('El area del triangulo es: ',res:10:10);
//Si res es 21.456 devuelve 0000000021.4560000000

//Esto hace que haya mínimo 2 digitos delante de la coma y exactamente 6 detras:
writeln('El area del triangulo es: ',res:2:6);
//Si res es 2124.45656668 devuelve 2124.456567 (a partir del último decimal se redondea)

Como veis este método no resulta una solución perfecta en absoluto, ya que, no solo aparecen ceros hasta que se rellane el total de digitos decimales, sino que si la cantidad de cifras decimales fuese mayor que la impuesta se redondearía al llegar a límite.

Más tarde encontré la función ‘format()’ de la unidad sysutils (puedes encontrar información de dicha función en la documentación de FreePascal). Está función permite dar formato de forma parecida a la que lo hace ‘printf()’ en C, pero mucho más liosa y no me solucionó nada.

Al final la solución fué mucho más simple y se me ocurrió en un momento de lucidez después de no encontrarla por internet. Es tan simple como pasar la variable a tipo ‘String’, antes de mostrarla en pantalla, de esa manera no será de tipo ‘double’ ni nada parecido, sino que será una cadena de texto. Recordad que antes debemos declarar la variable de tipo ‘string’. Podemos darle un limite de caracteres (uno muy grande ya que ahora no nos lo rellenará con ceros), ya si no lo hacemos y el resultado de la operación es un número irracional infinito el programa se tildará. Yo a la nueva variable la llamé ‘fres’. Luego para pasar el contenido de ‘res’ como String a ‘fres’ hacemos lo siguiente:

fres:= floattostr(res);
writeln('El area del triangulo es: ',fres);

Hemos utilizado la función ‘FloatToString()’ que de manera muy simple nos pasa un número de tipo flotante (ya sea ‘double’, ‘real’, etc) a cadena de texto.

Espero que os haya gustado y os haya sido útil este tutorial y si es así podéis darme un +1 o compartir en Twitter o Facebook. Si os gusta el blog abajo hay un formulario para seguirlo por correo electrónico. ¡Hasta la próxima!

Anuncios
Como dar formato a un WriteLn que contiene un numero con coma flotante en Pascal