[R] Using Rmpfr to round with precision in R

Martin Maechler maechler at stat.math.ethz.ch
Thu Nov 27 10:10:39 CET 2014

>>>>> Artur Augusto <arturaugusto at gmail.com>
>>>>>     on Wed, 19 Nov 2014 15:26:12 -0200 writes:

    > I'm trying to use the Rmpfr library with the round() function to apply
    > the round half to even rule and achieve correct results, without
    > errors due the finite precision of float point values.

    > Example of problem:

    > round(1.225,2)
    > #[1] 1.23

    > So far, this is what I've achieved:

    > library(Rmpfr)
    > x <- c(1.225, 1.2225, 1.22225, 1.222225)
    > n <- c(2, 3, 4, 5)
    > round2 <- function(x, n){
    > sprintf(paste("%#.", n, "f", sep=""), round(mpfr(as.character(x), 200), n))
    > }
    > mapply(round2, x, n)
    > #[1] "1.22"    "1.222"   "1.2222"  "1.22222"

The above  round2() function is really pretty strange [what do you really want?]
but below,  you have a very good point :

    > But in some cases I don't get the desired results:

    > round2(1.152, 2)# Should be 1.15
    > #[1] "1.16"

    > Reading the Rmpfr docs, at the roundMpfr() function, it says:

Actually,  roundMpfr() is *not* used  by  round(<mpfr>, *)
It has somewhat different semantics. That's why I used a new
function name, roundMpfr(),  whereas the round() method for
"mpfr" objects is what you get from

selectMethod(round, "mpfr")

    > The mpfr class group method Math2 implements a method for round(x,
    > digits) which rounds to decimal digits.

Indeed... and that is different from the roundMpfr() as
mentioned above.

    > But I can't figure how to use it.

    > How can I achieve desired rounded results?
    > Artur

Wait a day or two [depending on how quickly the new Rmpfr version 0.5-7
gets published on CRAN], and update your Rmpfr package.
The problem is fixed in Rmpfr 0.5-7.

If you had CC'ed your e-mail to  
I would have heard of the problem earlier and almost surely
have fixed it earlier.

Best regards,
Martin Maechler  (maintainer of 'Rmpfr').

More information about the R-help mailing list