2009-10-13 6 views
27

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

(fromIntegral 100)/10.00 

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

Спасибо.

+0

Он должен быть представлен в виде строки. То есть 10,00. – Anders

ответ

51

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

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

ИМО этот ответ должен быть принят. –

+0

@ Никита.Волков. Лучше поздно, чем никогда ;-) – Anders

22

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

Я перефразирую вопрос :-) Я хочу вернуть строковое представление поплавка с ровно двумя decimans - не печатать его в stdout. Я не могу найти ничего конкретного в функции «sprintf» в Haskell, как я надеялся. Любые подсказки? – Anders

+0

Хорошая точка. Я обновил свой ответ. – Stephan202

+0

Попробуйте округлить, а затем распечатать поплавок? –