Korzystanie następujący fragment kodu:Haskell: Siła płynie mieć dwie dziesiętne
(fromIntegral 100)/10.00
Korzystanie z Haskell '98 standardowego preludium, jak mogę reprezentować wynik z dwóch miejsc po przecinku?
Dzięki.
Korzystanie następujący fragment kodu:Haskell: Siła płynie mieć dwie dziesiętne
(fromIntegral 100)/10.00
Korzystanie z Haskell '98 standardowego preludium, jak mogę reprezentować wynik z dwóch miejsc po przecinku?
Dzięki.
Tak dla przypomnienia:
import Numeric
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
IMO ta odpowiedź powinna być zaakceptowana. –
@NikitaVolkov Zrobione. Lepiej późno niż wcale ;-) – Anders
Można użyć printf :: PrintfType r => String -> r
z 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
formatuje drugi argument w postaci liczby zmiennoprzecinkowej. %.2f
wskazuje, że powinny zostać wydrukowane tylko dwie cyfry za kropką dziesiętną. \n
reprezentuje znak nowej linii. Nie jest to konieczne dla tego przykładu.
Należy zauważyć, że ta funkcja zwraca wartość typu String
lub IO a
, w zależności od kontekstu. Demonstracja:
Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number"
"1337.00 is a number"
W tym przypadku printf
zwraca łańcuch "1337.00"
, ponieważ wynik jest przekazywana jako argument do (++)
, która to funkcja, która spodziewa się lista argumentów (zauważ, że String
jest taka sama jak [Char]
). Jako taki, printf
również zachowuje się jak sprintf
w innych językach. Oczywiście sztuczka taka jak dodanie drugiego ciągu nie jest konieczna. Można po prostu jawnie określić typ:
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a
1337.00
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String
"1337.00\n"
Będę przeformułować pytanie :-) Chcę przywrócić reprezentację ciągów zmiennoprzecinkowych z dokładnie dwoma dziesiętnastymi - nie wypisz go na standardowe wyjście. Nie mogę znaleźć nic konkretnego na temat funkcji sprintf w Haskell, jak miałem nadzieję. Jakieś wskazówki? – Anders
Dobra uwaga. Zaktualizowałem swoją odpowiedź. – Stephan202
Spróbuj zaokrąglić, a następnie wydrukować zmiennoprzecinkowe? –
To ma być reprezentowany jako ciąg znaków. To znaczy. 10,00. – Anders