Не намного точнее, чем это.
var seconds = new Date().getTime(), last = seconds,
intrvl = setInterval(function() {
var now = new Date().getTime();
if(now - last > 5){
if(confirm("Delay registered, terminate?")){
clearInterval(intrvl);
return;
}
}
last = now;
timer.innerHTML = now - seconds;
}, 333);
Что касается того, почему это не точно, я бы предположил, что машина занята другими делами, немного замедляя каждую итерацию добавляет, как вы видите.