@huftis Please check the arguments breaks and labels of the function cut. You need those to harness the full power of it. The arguments right and include.lowest give you further power to do what you need:
x <- rnorm(100)
str(cut(x,
breaks = c(-Inf,0,Inf),
labels = c("Below 0", "0 or more"),
right = FALSE))
I see your point about the default labeling. But if you check the code, you see that dig.lab gives you the number of significant digits, not the number of digits after the decimal. And the problem with the code in that post is that the labels are wrong, not the binning 
cut(c(20.8, 21.3, 21.7, 23, 25), 2, dig.lab=2)
#> [1] (21,23] (21,23] (21,23] (23,25] (23,25]
#> Levels: (21,23] (23,25]
cut(c(20.8, 21.3, 21.7, 23, 25), 2, dig.lab=3)
#> [1] (20.8,22.9] (20.8,22.9] (20.8,22.9] (22.9,25] (22.9,25]
#> Levels: (20.8,22.9] (22.9,25]
So the first border is actually 20.8, not 21.