Haskell: заставляет float иметь два десятичных знака - PullRequest
30 голосов
/ 13 октября 2009

Используя следующий фрагмент кода:

(fromIntegral 100)/10.00

Используя стандартную прелюдию Haskell '98, как представить результат с двумя десятичными знаками?

Спасибо.

Ответы [ 2 ]

53 голосов
/ 24 февраля 2010

Только для записи:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
24 голосов
/ 13 октября 2009

Вы можете использовать printf :: PrintfType r => String -> r из 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 форматирует второй аргумент как число с плавающей запятой. %.2f указывает, что должны быть напечатаны только две цифры после десятичной точки. \n представляет новую строку. Это не обязательно для этого примера.

Обратите внимание, что эта функция возвращает значение типа String или IO a, в зависимости от контекста. Демонстрация:

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

В этом случае printf возвращает строку "1337.00", потому что результат передается в качестве аргумента (++), который является функцией, которая ожидает аргументы списка (обратите внимание, что String совпадает с [Char] ). Таким образом, printf также ведет себя как sprintf в других языках. Конечно, такой трюк, как добавление второй строки, не нужен. Вы можете просто явно указать тип:

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