Se pps è maggiore/uguale a 1000 ... avrai sempre 0.
Comunque nota che in Thread esiste anche:
sleep(long millis, int nanos)
Solo che dovresti calcolarti anche la parte dei nanosecondi. Ma c'è un modo più semplice da Java 5:
TimeUnit.NANOSECONDS.sleep(nanosecondiCalcolati);
(TimeUnit è la java.util.concurrent.TimeUnit)
EDIT: la documentazione di quella sleep comunque lo dice chiaramente: subject to the precision and accuracy of system timers and schedulers
Quindi dipende dalla piattaforma e sistema operativo, pertanto non puoi farci "troppo" affidamento.