Округление в C#

426
07 марта 2018, 05:03

Есть число типа double

Нужно округлить данное число до N знаков после запятой используя округления: математическое (обычное школьное), банкирское (к ближайшемо чётному), обрезание (просто обрезать до N знаков после запятой)

Как это сделать средствами языка C# ?

Пример:

value = 0.428509, N = 3

мат. :0.429

банк. :0.428

обрез. :0.428

Answer 1

Для начала, округление не до целого числа не имеет смысла для чисел типа double, т. к. числа наподобие 0.1 вовсе не могут быть представлены точно в виде двоичных дробей.

Поэтому вычисления имеют смысл лишь для типа данных decimal, который как раз представляют собой десятичные дроби.

Заметьте, что разные типы округления дают разные результаты только в случае, когда исходное число заканчивается на 5, и округление происходит на один разряд. В противном случае округление всегда идёт вниз для последней цифры меньше 5, или вверх для больше 5. В вашем примере последняя цифра — не 5, и правильный результат для банковского округления — тоже 0.429m. Результат 0.428m был бы для числа 0.4285m. (m в конце обозначает константу типа decimal)

Для банковского округления есть стандартная функция:

decimal value = 0.428509m;
int N = 3;
decimal bankers = decimal.Round(value, N, MidpointRounding.ToEven);

Если вы подразумеваете под обычным школьным округлением округление, которое для чисел заканчивающихся на 5 округляет вверх, используйте

 decimal standard = decimal.Round(value, N, MidpointRounding.AwayFromZero);

Для truncate (обрезания) поддержки в стандартной библиотеке нет, и вам нужно сначала вычислить 10m в степени N (умножением в цикле), умножить value на получившееся число, выполнить decimal.Truncate, а затем поделить назад. Код, надеюсь, напишете сами?

Answer 2

Функция Math.Floor не поддерживает указанный вами режим, поэтому напишите свой кастомный метод:

public static double Truncate(double value, int precision)
{
    return Math.Truncate(value * Math.Pow(10, precision)) / Math.Pow(10, precision);
}

Взято отсюда: Truncate number of digit of double value in C# - там же можете вдохновиться примером с переводом в строку и обрезкой ненужной части, если не очень хочется использовать функцию возведения в степень.

Также, стоит задуматься, почему вы используете такую странную и редкую форму округления, которой даже нет в стандартной библиотеке. Возможно, вам всё же подойдёт вариант из стандартных AwayFromZero или ToEven.

READ ALSO
Вывод значения на сцену в юнити

Вывод значения на сцену в юнити

Допустим, я хочу выводить значение на сцену в юнитиНапример у меня есть переменная second которая обновляется в функции update() и мне надо выводить...

246
Автоматические свойства C# [дубликат]

Автоматические свойства C# [дубликат]

На данный вопрос уже ответили:

214
Как лучше реализовать задачу?

Как лучше реализовать задачу?

Есть функцияТуда я бросаю список List<double>, прохожусь по каждому элементу и рассчитываю некоторыми функциями новый массив

199