Подтвердить что ты не робот

Haskell: Force floats имеет два десятичных знака

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

(fromIntegral 100)/10.00

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

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

Вы можете использовать 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"