# Re: [R] Why doesn't formatC( x, digits=2, format="g") doesn't always give 2 sig figs?

From: Duncan Murdoch <murdoch_at_stats.uwo.ca>
Date: Thu, 05 Jun 2008 21:39:51 -0400

On 05/06/2008 8:48 PM, Peter Dunn wrote:
> Hi all
>
> I am not a C programmer, but I am trying to understand formatC to
> get consistent printing of reals to a given number of significant
> digits.
>
> Can someone please explain this to me? These first three give what
> I expect on reading ?formatC:
>
>

```>> formatC(0.0059999, digits=2,format="fg",flag="#")
```

> [1] "0.0060"
```>> formatC(0.59999, digits=2,format="fg",flag="#")
```

> [1] "0.60"
```>> formatC(5.9999, digits=2,format="fg",flag="#")
```

> [1] "6.0"
>
>
> This seems consistent with what I read (but perhaps do not
> understand) in ?formatC, where I read this:
>
>
> digits the desired number of digits after the decimal point
> (format = "f") or significant digits (format = "g", = "e" or
> = "fg").
>
>
> Since I am using format="fg" and digits=2, so I am expecting two
> significant digits to always show, which I have above. So I fail to
> understand this:
>
>
```>> formatC(0.000059999, digits=2,format="fg",flag="#")
```

> [1] "0.00006"
```>> formatC(0.000059, digits=2, format="fg",flag="#")
```

> [1] "0.000059"
>
>
> I was expecting both of these to produce "0.000059". But in the
> first case above, I get one significant digit only.
>
> I'm obviously misunderstanding something; can someone enlighten me?
> (No doubt, someone will point out a nuance of the help files I
> didn't understand!)
>
> Also, since the above obviously doesn't do what I hoped
> (consistently printing two sig figs), could someone also explain
> how I can consistently get two significant figures in situation
> like above?

I'll let someone else comment on whether this is a bug in formatC; it looks like a bug or a documentation error to me.

You can get 2 sig figs in your situation like this:

sprintf("%.6f",0.000059999)

but obviously this doesn't help with numbers on a different scale. For those, I think you're going to have to put together something like

x <- 0.0000599999
sprintf("%.*f", -trunc(log10(x))+2, x)

(which only works for numbers less than 1).

Duncan Murdoch

R-help_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code. Received on Fri 06 Jun 2008 - 02:13:13 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 06 Jun 2008 - 03:30:38 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.