Mit dem folgenden Codeausschnitt:Haskell: Kraft schwimmt zwei Dezimalstellen haben
(fromIntegral 100)/10.00
Mit dem Haskell '98 Standard Auftakt, wie kann ich das Ergebnis mit zwei Dezimalstellen repräsentieren?
Danke.
Mit dem folgenden Codeausschnitt:Haskell: Kraft schwimmt zwei Dezimalstellen haben
(fromIntegral 100)/10.00
Mit dem Haskell '98 Standard Auftakt, wie kann ich das Ergebnis mit zwei Dezimalstellen repräsentieren?
Danke.
Nur für das Protokoll:
import Numeric
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
IMO diese Antwort sollte die akzeptierte sein. –
@NikitaVolkov Fertig. Besser spät als nie ;-) – Anders
Sie können printf :: PrintfType r => String -> r
von Text.Printf
verwenden:
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
formatiert das zweite Argument als Gleitkommazahl. %.2f
zeigt an, dass nur zwei Stellen hinter dem Dezimalpunkt gedruckt werden sollen. \n
repräsentiert eine neue Zeile. Dies ist für dieses Beispiel nicht unbedingt erforderlich.
Beachten Sie, dass diese Funktion je nach Kontext einen Wert vom Typ String
oder IO a
zurückgibt. Demonstration:
Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number"
"1337.00 is a number"
In diesem Fall printf
die Zeichenfolge "1337.00"
zurückgibt, weil das Ergebnis als Argument an (++)
übergeben wird, die eine Funktion ist, die Liste Argumente (beachten Sie, dass String
die gleiche wie [Char]
ist) erwartet. Daher verhält sich printf
auch in anderen Sprachen als sprintf
. Natürlich ist ein Trick wie das Anhängen einer zweiten Zeichenfolge nicht notwendig. Sie können nur explizit den Typ angeben:
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a
1337.00
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String
"1337.00\n"
Ich werde die Frage umformulieren :-) Ich möchte eine String-Darstellung eines Floats mit genau zwei Dezimalen zurückgeben - nicht auf stdout drucken. Ich kann in Haskell nichts Konkretes über eine Sprintf-Funktion finden, wie ich es mir erhofft hatte. Irgendwelche Hinweise? – Anders
Guter Punkt. Ich habe meine Antwort aktualisiert. – Stephan202
Versuchen Sie, den Schwimmer zu runden und dann zu drucken? –
es angenommen hat, als Zeichenfolge dargestellt werden. I.e. 10.00 Uhr – Anders