みなさん、色々とありがとうございます。

あれから、色々と検証したのですがAPIのLPtoDP関数と
同等の関数(int版, double版の2つ)を作成して
それぞれの関数を10万回実行したときの時間を計測したのですが
LPtoDP と自作同等関数 (int版) がほぼ同じ時間だったので
APIも内部は整数で計算していると思われます。
(double版は倍以上の時間がかかっていたため)

結局、整数で計算して四捨五入するようにしたのですが
やはり>>44の※1, ※2のようなケース(小数部0.5前後)で
APIと結果が異なってしまいます。

四捨五入は>>48さんの式をお借りして

// 余り算出
int nMod = (PX * a + b) % c;
// 余りが、割る数 c の半分以上の場合を四捨五入対象とする
if (abs(nMod) >= abs(c >> 1))
{
 // 四捨五入 (割られる数、割る数の符号チェックの方が確実?)
 if (QX > 0) { QX++; } else { QX--; }
}

以上のような処理で行っています。
ここまでやっても、APIと異なるので何か特別な方法があるような気がして
ならないのです。
どうか、よいお知恵をお貸しください。

>>48さん
最適化した式をありがとうございます。
しかし、まだ最適化以前の問題ですので・・・今後、参考にさせていただきます。