>sprintf(buf,"%.0f",dval);
それ四捨五入してるだけだぞ
そんなんでいいなら ival = floor(dval * 100 + 0.5) とでもやればいい

元々 -19.99 という値自体が誤差を持ってるから、これを無くすことは出来ない
printf("%.20f\n", -19.99); とかやってみればわかる

本当に誤差が嫌なら、浮動小数点を使わない、という方法しかない