2009-10-13 4 views
27

Utilizzando il seguente frammento di codice:Haskell: Forza galleggianti di avere due decimali

(fromIntegral 100)/10.00 

Utilizzando il preludio standard di Haskell '98, come faccio io rappresento il risultato con due decimali?

Grazie.

+0

E 'dovrebbe essere rappresentato come una stringa. Cioè 10.00. – Anders

risposta

51

Solo per la cronaca:

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

IMO questa risposta dovrebbe essere accettata. –

+0

@NikitaVolkov Fatto. Meglio tardi che mai ;-) – Anders

22

È possibile utilizzare printf :: PrintfType r => String -> r da 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 formatta il secondo argomento come un numero in virgola mobile. %.2f indica che devono essere stampate solo due cifre dietro la virgola decimale. \n rappresenta una nuova riga. Non è strettamente necessario per questo esempio.

Si noti che questa funzione restituisce un valore di tipo String o IO a, a seconda del contesto. Dimostrazione:

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

In questo caso printf restituisce la stringa "1337.00", perché il risultato viene passato come argomento a (++), che è una funzione che prevede Lista argomenti (notare che String è la stessa [Char]). Pertanto, printf si comporta anche come sprintf in altre lingue. Ovviamente non è necessario un trucco come aggiungere una seconda stringa. Si può solo specificare in modo esplicito il 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" 
+2

Riformulerò la domanda :-) Voglio restituire una rappresentazione in formato stringa di un float con esattamente due decimani - non stamparlo sullo stdout. Non riesco a trovare nulla di concreto su una funzione di "sprint" in Haskell come speravo. Eventuali suggerimenti? – Anders

+0

Buon punto. Ho aggiornato la mia risposta. – Stephan202

+0

Prova ad arrotondare e poi a stampare il float? –