あなたは実際には中点にいません。MidpointRounding.ToEven
番号が99.965、つまり99.96500000 [etc。]の場合、99.96になることを示します。Math.Roundに渡す数値はこの中間点を超えているため、切り上げています。
数値を99.96に切り捨てる場合は、次のようにします。
// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);
そしてねえ、これは一般的なケースのために上記を行うための便利な小さな関数です:
// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
double multiplier = Math.Pow(10.0, digits + 1);
double truncated = Math.Truncate(value * multiplier) / multiplier;
return Math.Round(truncated, digits, mode);
}