private static double RoundInternal(double value, RoundMode mode)
{
double tmp_value;
if (value >= 0.0)
{
tmp_value = Math.Floor(value + 0.5);
if (mode != RoundMode.HalfUp)
{
if ((mode == RoundMode.HalfDown && value == (-0.5 + tmp_value)) ||
(mode == RoundMode.HalfEven && value == (0.5 + 2 * Math.Floor(tmp_value * .5))) ||
(mode == RoundMode.HalfOdd && value == (0.5 + 2 * Math.Floor(tmp_value * .5) - 1.0)))
{
tmp_value = tmp_value - 1.0;
}
}
}
else
{
tmp_value = Math.Ceiling(value - 0.5);
if (mode != RoundMode.HalfUp)
{
if ((mode == RoundMode.HalfDown && value == (0.5 + tmp_value)) ||
(mode == RoundMode.HalfEven && value == (-0.5 + 2 * Math.Ceiling(tmp_value * .5))) ||
(mode == RoundMode.HalfOdd && value == (-0.5 + 2 * Math.Ceiling(tmp_value * .5) + 1.0)))
{
tmp_value = tmp_value + 1.0;
}
}
}
return tmp_value;
}