Округление значений вверх или вниз в C#
Я создал игру, которая дает счет в конце игры, но проблема в том, что этот счет иногда является числом с большим количеством цифр после десятичной запятой (например, 87.124563563566). Как бы мне округлить значение вверх или вниз, чтобы получить что-то вроде 87.12?
Спасибо!
8 ответов
Попробуйте использовать Math.Round. Его различные перегрузки позволяют вам указать, сколько цифр вы хотите, а также, каким образом вы хотите, чтобы он округлил число.
Использование Math.Ceiling(87.124563563566)
или же Math.Floor(87.124563563566)
для всегда округления вверх или округления вниз. Я считаю, что это идет к ближайшему целому числу.
Чтобы всегда округлять до 2 десятичных знаков:
decimal score = 87.126;
Math.Floor(score * 100) / 100; // 87.12
Чтобы всегда округлять до 2 десятичных знаков:
decimal score = 87.124;
Math.Ceiling(score * 100) / 100; // 87.13
double test2 = 87.2345524523452;
double test3 = Math.Round(test2, 2);
Номер подходит для double
тип переменной, и математически правильно.
У вас есть два хорошо продуманных решения, чтобы избежать подобных ситуаций.
- Строковое решение: когда вы показываете число пользователям, просто сделайте это: variable.ToString("0.00"). ToString просто сокращает число.
- решение для округления: если вы хотите контролировать округление, вы можете использовать
Math
библиотека.
Если вы хотите узнать, почему вы видите это "странное" число, вы можете прочитать там: иррациональные числа
У меня недостаточно репутации, чтобы добавлять комментарии, поэтому я должен создать ответ. Но Тимурид прав, просто отформатируйте строку.
Я думаю, что вы ищете это:
var myScore = 87.124563563566
var toShowOnScreen = myScore.ToString("0.00");
Некоторые из пользовательских способов форматирования ваших значений описаны здесь: https://msdn.microsoft.com/en-US/library/7x5bacwt(v=vs.80).aspx
Многие люди рекомендуют использовать библиотеку Math для округления вашего числа, но даже это может привести к очень незначительным ошибкам округления. Math.Round может, а иногда и возвращает числа с конечными нулями и очень маленькими ошибками округления. Это связано с тем, что внутренне числа с плавающей запятой и числа с двойными числами по-прежнему представлены в виде двоичных чисел, и поэтому часто бывает трудно точно представить некоторые небольшие десятичные числа.
Лучше всего либо использовать форматирование строк, либо, если вы действительно хотите, чтобы оно действительно округлялось, объединить два:
Math.Round(val, 2).ToString("0.00")