This is controlled by the digits
setting in your options. options("digits")
will tell you the current value, options(digits=8)
(for example) will set the value. The "extra" values at the end are due to floating-point error (see Chapter 1 of The R Inferno or search Stack Overflow for question about floating point, e.g. this one. (Note that this doesn't change the underlying value, just the way it is printed.)
It's impossible to express 0.1 exactly in binary floating-point representation.
Here's what gets printed with different digits settings (it looks like you must have digits
set to 17 ...)
x <- "0.1"
for (i in 1:20) print(c(i,as.numeric(x)), digits=i)
[1] 1.0 0.1
[1] 2.0 0.1
[1] 3.0 0.1
[1] 4.0 0.1
[1] 5.0 0.1
[1] 6.0 0.1
[1] 7.0 0.1
[1] 8.0 0.1
[1] 9.0 0.1
[1] 10.0 0.1
[1] 11.0 0.1
[1] 12.0 0.1
[1] 13.0 0.1
[1] 14.0 0.1
[1] 15.0 0.1
[1] 16.0 0.1
[1] 17.00000000000000000 0.10000000000000001
[1] 18.000000000000000000 0.100000000000000006
[1] 19.0000000000000000000 0.1000000000000000056
[1] 20.00000000000000000000 0.10000000000000000555
As you suggest in your comment, you can use all.equal()
to test for approximate equality. as.numeric(x)==0.1
is TRUE
, as is all.equal(as.numeric(x),0.1)
. You can adjust the tolerance of all.equal()
:
z1 <- 0.1
z2 <- z1 + 1e-14
all.equal(z1,z2) ## TRUE
all.equal(z1,z2,tolerance=1e-15)
## [1] "Mean relative difference: 1.000589e-13"
isTRUE(all.equal(z1,z2,tolerance=1e-15)) ## FALSE