Используя следующий фрагмент кода:Haskell: Force поплавки иметь две десятичные
(fromIntegral 100)/10.00
Используя стандартную прелюдию Haskell '98, как я представляю результат с двумя знаками после запятой?
Спасибо.
Используя следующий фрагмент кода:Haskell: Force поплавки иметь две десятичные
(fromIntegral 100)/10.00
Используя стандартную прелюдию Haskell '98, как я представляю результат с двумя знаками после запятой?
Спасибо.
Только для записи:
import Numeric
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
ИМО этот ответ должен быть принят. –
@ Никита.Волков. Лучше поздно, чем никогда ;-) – Anders
Вы можете использовать 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"
Я перефразирую вопрос :-) Я хочу вернуть строковое представление поплавка с ровно двумя decimans - не печатать его в stdout. Я не могу найти ничего конкретного в функции «sprintf» в Haskell, как я надеялся. Любые подсказки? – Anders
Хорошая точка. Я обновил свой ответ. – Stephan202
Попробуйте округлить, а затем распечатать поплавок? –
Он должен быть представлен в виде строки. То есть 10,00. – Anders