Haskell: Fuerza flota para tener dos decimales


Usando el siguiente fragmento de código:

(fromIntegral 100)/10.00

Usando el preludio estándar de Haskell '98, ¿cómo represento el resultado con dos decimales?

Gracias.

Author: viaclectic, 2009-10-13

2 answers

Solo para que conste:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
 52
Author: viaclectic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-24 16:56:23

Puede utilizar printf :: PrintfType r => String -> r de Text.Printf:

Prelude> import Text.Printf
Prelude Text.Printf> printf "%.2f\n" (100 :: Float)
100.00
Prelude Text.Printf> printf "%.2f\n" $ fromIntegral 100 / 10.00
10.00

%f formatea el segundo argumento como un número de coma flotante. %.2f indica que solo deben imprimirse dos dígitos detrás del punto decimal. \n representa una nueva línea. No es estrictamente necesario para este ejemplo.

Tenga en cuenta que esta función devuelve un valor de tipo String o IO a, dependiendo del contexto. Demostración:

Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number"
"1337.00 is a number"

En este caso printf devuelve la cadena "1337.00", porque result se pasa como argumento a (++), que es una función que espera argumentos de lista (tenga en cuenta que String es lo mismo que [Char]). Como tal, printf también se comporta como sprintf lo haría en otros idiomas. Por supuesto, un truco como añadir una segunda cadena no es necesario. Solo puede especificar explícitamente el tipo:

Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a  
1337.00
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String
"1337.00\n"
 23
Author: Stephan202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-23 20:15:40