# [Haskell-cafe] Problem with percentage function?

Chapman, Anthony Sergio a.s.chapman.10 at aberdeen.ac.uk
Sun Apr 20 21:50:43 UTC 2014

```Thank you very much, that worked a charm. The numbers crunching was done way before the printing so that's all I needed. Now it seems a bit peculiar to me that in your functions, you didn't define the input ie toPerc = printf "%.2f" . (*100) instead of toPerc number = printf "%.2f" . (*100)

Would you might pointing me in the right direction to understand why you didn't have to give it a variable input when defining the function?

Thanks again.
________________________________________
Sent: 20 April 2014 22:45
Subject: Re: [Haskell-cafe] Problem with percentage function?

On Sun, Apr 20, 2014 at 09:12:29PM +0000, Chapman, Anthony Sergio wrote:
> -- Turns a number into a percentage
> toPerc :: Double -> Double
> toPerc x = 100*(myRound x 4)
> -- Rounds a number to s decimal points
> myRound n s = fromIntegral (round (n * factor)) / factor
>     where factor = fromIntegral (10^s)
>
> I would it to round to 2 decimal places no matter what the size of the input is
>
> ei toPerc 0.22222222222222  --- = 22.22
>     toPerc 0.22342222222222  --- = 22.34
>
> The problem is that what I actually get is 22.220000000000002

The other replies, whilst correct, have been a bit oblique to your question.
The upshot is you should do the rounding when displaying, not in the
floating point value itself.

import Text.Printf

toPerc :: Double -> String
toPerc = printf "%.2f" . (*100)

*Main> toPerc 0.22222222222222
"22.22"
*Main> toPerc 0.22342222222222
"22.34"

Tom
_______________________________________________