Кинда удивилась, что никто не указал прямой способ сделать это, что достаточно просто.
double roundToDecimalPlaces(double value, int decimalPlaces)
{
double shift = Math.pow(10,decimalPlaces);
return Math.round(value*shift)/shift;
}
Уверен, это не делает даже полукруглое округление.
Во всяком случае, округление до половины даже будет хаотичным и непредсказуемым всякий раз, когда вы смешиваете двоичные значения с плавающей запятой с арифметикой с основанием 10. Я уверен, что это невозможно сделать. Основная проблема заключается в том, что значение типа 1.105 не может быть представлено точно с плавающей запятой. Значение с плавающей запятой будет что-то вроде 1.105000000000001 или 1.104999999999999. Таким образом, любая попытка выполнить полуначетное округление приводит к ошибкам в представительном кодировании.
Реализации IEEE с плавающей запятой будут выполнять половину округления, но они выполняют двоичное округление, а не десятичное полу округление. Так что вы, вероятно, в порядке