Есть число типа double
Нужно округлить данное число до N знаков после запятой используя округления: математическое (обычное школьное), банкирское (к ближайшемо чётному), обрезание (просто обрезать до N знаков после запятой)
Как это сделать средствами языка C# ?
Пример:
value = 0.428509, N = 3
мат. :0.429
банк. :0.428
обрез. :0.428
Для начала, округление не до целого числа не имеет смысла для чисел типа 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
, а затем поделить назад. Код, надеюсь, напишете сами?
Функция 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.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Допустим, я хочу выводить значение на сцену в юнитиНапример у меня есть переменная second которая обновляется в функции update() и мне надо выводить...
Есть функцияТуда я бросаю список List<double>, прохожусь по каждому элементу и рассчитываю некоторыми функциями новый массив