В программе я вычисляю процент и печатаю его пользователю. Проблема заключается в том, что процентный отпечаток отображается со слишком большим количеством десятичных знаков. Я искал функцию, решая эту проблему, не нашел ее и запрограммировал функцию округления ниже, но мне интересно, есть ли более стандартный способ сделать это. Кроме того, идея, описанная в этой теме Java, является довольно опрятной, и если уже есть функции для этого, я хотел бы знать.
roundTo :: (Integral int1, Integral int2) => int1 -> Double -> Either int2 Double
roundTo digitsAfterComma value
| (digitsAfterComma >= 1) =
let
factor = fromIntegral (10 ^ digitsAfterComma)
result = ((/ factor) . fromIntegral . round . (* factor)) value
in
Right result
| (digitsAfterComma == 0) = Left (round value)
| otherwise = error "minimal precision must be non-negative"
Обновление. Ниже приведена более полная версия, разработанная благодаря полученным ответам.
import qualified Text.Printf as T
showPercentage :: (Integral a, Show a) => a -> Double -> String
showPercentage digitsAfterComma fraction
| (digitsAfterComma >= 1) =
let formatString = "%." ++ (show digitsAfterComma) ++ "f%%"
in T.printf formatString percentage
| (digitsAfterComma == 0) =
let formatString = "%d%%"
in T.printf formatString (round percentage :: Int)
| otherwise = error "minimal precision must be non-negative"
where percentage = 100 * fraction