[R] unexpected behavior using round to 2 digits on randomly generated numbers

Jeff Newmiller jdnewmil at dcn.davis.ca.us
Sun Nov 28 22:53:05 CET 2010


FAQ 7.31

http://cran.r-project.org/doc/FAQ/R-FAQ.html#Why-doesn_0027t-R-think-these-numbers-are-equal_003f

You find it odd that the result is not an integer, while I find the fact 
that your calculation actually works reliably with any number of digits 
surprising, and you should avoid assuming such behavior will continue in 
the future. Multiply by the appropriate range and THEN take the integer 
part.

Patient: Doctor, it hurts when I ram my head into the wall!
Doctor: Don't do that!

Cory Rieth wrote:
> Hello!
>
> I stumbled upon something odd that took a while to track down, and I wanted to run it by here to see if I should submit a bug report. For randomly generated numbers (from a variety of distributions) rounding them to specifically 2 digits and then multiplying them by 100 produces strange results on about 8% of cases. The problematic numbers display as I would have expected, but do not logically match the as.integer counterpart (additionally they will not be used correctly by functions such as rep()). I realize there are easy workarounds, but I wouldn't have expected this result, and it only occurs rounding to 2 decimals, i.e. changing digits to 3 and multiplying by 1000 after rounding gives the expected result.
>
> x<-runif(100)				#generate some random numbers
> y<-round(x,digits=2)*100  #round them all to two decimals, then multiply them all by 100. I expected the results to all be integers
> sum(y!=as.integer(y))		#but on about 8% of the numbers they do not match the integer version
> x[which(y!=as.integer(y))]	# a list of the problem numbers from the original distribution. They seem to be more common but not exclusive to .54 to .57
> y[which(y!=as.integer(y))]  #the numbers still display as would be expected, i.e. they are integers
> as.integer(y[which(y!=as.integer(y))])  # and sometimes display as the same number they are not logically identical to
>
> Thanks, and sorry if I came across something that is known, or it is meant to behave this way, I couldn't find anything. 
>
> Cory Rieth
>
> R.version() output:
> platform       x86_64-apple-darwin9.8.0     
> arch           x86_64                       
> os             darwin9.8.0                  
> system         x86_64, darwin9.8.0          
> status                                      
> major          2                            
> minor          12.0                         
> year           2010                         
> month          10                           
> day            15                           
> svn rev        53317                        
> language       R                            
> version.string R version 2.12.0 (2010-10-15)
> ______________________________________________
> 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.
>



More information about the R-help mailing list