[R] as.character(seq(-.35,.95,.1))

Marc Schwartz marc_schwartz at comcast.net
Tue Nov 20 17:18:28 CET 2007


On Tue, 2007-11-20 at 11:07 -0500, Duncan Murdoch wrote:
> On 11/20/2007 10:50 AM, Ken Fullish wrote:
> >  > as.character(seq(-.25,.95,.1))
> >   [1] "-0.25" "-0.15" "-0.05" "0.05"  "0.15"  "0.25"  "0.35"  "0.45"   
> > "0.55"  "0.65"  "0.75"  "0.85"  "0.95"
> > 
> >  > as.character(seq(-.35,.95,.1))
> >   [1] "-0.35"               "-0.25"                
> > "-0.15"               "-0.0499999999999999" "0.05"
> >   [6] "0.15"                "0.25"                 
> > "0.35"                "0.45"                "0.55"
> > [11] "0.65"                "0.75"                 
> > "0.85"                "0.95"
> > 
> > Not a big deal, just curiosity:
> > Why do I obtain this "ugly" "-0.0499999999999999" instead of the  
> > expected "-0.05" ?
> 
> Because as.character() tries to do an accurate conversion, and the 
> number in your vector is closer to -0.0499999999999999 than to -0.05.
> You could get the "-0.05" by something like round( seq(...), 2).
> 
> The reason seq() doesn't give you exactly -0.05 is that the starting 
> values and step size you've chosen are not exactly representable in R's 
> floating point format.   It can only store fractions exactly when the 
> denominator is a power of 2.

In addition, if you want to take numeric values and format them for
output with a known number of fixed decimal places, use either ?formatC
or ?sprintf, the latter being generally preferred:

> sprintf("%.2f", seq(-.25,.95,.1))
 [1] "-0.25" "-0.15" "-0.05" "0.05"  "0.15"  "0.25"  "0.35"  "0.45" 
 [9] "0.55"  "0.65"  "0.75"  "0.85"  "0.95" 

> sprintf("%.2f", seq(-.35,.95,.1))
 [1] "-0.35" "-0.25" "-0.15" "-0.05" "0.05"  "0.15"  "0.25"  "0.35" 
 [9] "0.45"  "0.55"  "0.65"  "0.75"  "0.85"  "0.95" 

HTH,

Marc Schwartz



More information about the R-help mailing list