I don't get the same behaviour,
test <- function(digits, replications=10)
c(representation = as.character(signif(pi, digits)),
equality = any(replicate(replications, pi == signif(pi, digits))))
t(sapply(1:16, test))
representation equality
[1,] "3" "FALSE"
[2,] "3.1" "FALSE"
[3,] "3.14" "FALSE"
[4,] "3.142" "FALSE"
[5,] "3.1416" "FALSE"
[6,] "3.14159" "FALSE"
[7,] "3.141593" "FALSE"
[8,] "3.1415927" "FALSE"
[9,] "3.14159265" "FALSE"
[10,] "3.141592654" "FALSE"
[11,] "3.1415926536" "FALSE"
[12,] "3.14159265359" "FALSE"
[13,] "3.14159265359" "FALSE"
[14,] "3.1415926535898" "FALSE"
[15,] "3.14159265358979" "FALSE"
[16,] "3.14159265358979" "TRUE"
only returns TRUE for 16 digits, which is understandable because of the finite precision of doubles.