2009-10-13 13 views
27

Utilisation de l'extrait de code suivant:Haskell: Force flotte pour avoir deux décimales

(fromIntegral 100)/10.00 

Utilisation du Haskell '98 prélude standard, comment puis-je représente le résultat avec deux décimales?

Merci.

+0

Il est censé être représenté comme une chaîne. C'est à dire. 10.00. – Anders

Répondre

51

Pour la petite histoire:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum "" 
+9

OMI cette réponse devrait être acceptée. –

+0

@NikitaVolkov Fait. Mieux vaut tard que jamais ;-) – Anders

22

Vous pouvez utiliser 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 formate le second argument comme un nombre à virgule flottante. %.2f indique que seulement deux chiffres derrière la virgule décimale doivent être imprimés. \n représente une nouvelle ligne. Ce n'est pas strictement nécessaire pour cet exemple. Notez que cette fonction renvoie une valeur de type String ou IO a, en fonction du contexte. Démonstration:

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

Dans ce cas printf renvoie la chaîne "1337.00", parce que le résultat est passé comme argument à (++), qui est une fonction qui attend les arguments de la liste (notez que String est le même que [Char]). En tant que tel, printf se comporte également comme sprintf dans d'autres langues. Bien sûr, une astuce comme l'ajout d'une deuxième chaîne n'est pas nécessaire. Vous pouvez simplement spécifier explicitement le type:

Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a 
1337.00 
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String 
"1337.00\n" 
+2

Je vais reformuler la question :-) Je veux retourner une représentation sous forme de chaîne d'un float avec exactement deux décimans - pas l'imprimer sur stdout. Je ne trouve rien de concret sur une fonction 'sprintf' à Haskell comme je l'espérais. Des indices? – Anders

+0

Bon point. J'ai mis à jour ma réponse. – Stephan202

+0

Essayez d'arrondir puis d'imprimer le flotteur? –