Рейтинг:
36
Rob Philpott
Ну а как отмечают другие люди, это является закругление. Если вы хотите просто отрезать цифры после первых двух дробных единиц вы можете сделать это:
double y = Math.Floor(value*100d)/100d;
Однако имейте в виду, что двойники могут вызвать тонкие проблемы с точностью. Возможно, вы захотите рассмотреть возможность использования decimal
вместо этого с.
#realJSOP
Ответ получше моего. Кстати, вы, вероятно, можете решить проблемы точности, вызванные математикой, округлив результат:
value = Math.Round(Math.Floor(value*100d)/100d, 2);
Кроме того, если значение, с которого вы начинаете, отрицательно, вы должны вызвать математику.Вместо потолка.
value = Math.Round(((value >= 0d) ? Math.Floor(value * 100d) : Math.Ceiling(value * 100d)) / 100d, 2);
Рейтинг:
25
#realJSOP
Значение 18.0051 всегда будет округляться до 18.01. Чтобы сделать то, что вы хотите, вы можете использовать манипуляцию строками:
double value = 18.0051;
string str = value.ToString();
int pos = Math.Min(str.Length, str.IndexOf(".") + 3);
if (pos > 0)
{
str = str.Substring(0, pos);
}
value = Convert.ToDouble(str);
Вы можете поместить этот код в метод расширения, чтобы он всегда был доступен.
public static double Truncate(this double value, int places)
{
double result = value;
string str = value.ToString();
int pos = Math.Min(str.Length, str.IndexOf(".") + places + 1);
if (pos > 0)
{
str = str.Substring(0, pos);
}
result = Convert.ToDouble(str);
return result;
}
Использование нового метода расширения сократит ваш внешний код до одной строки:
double value = 18.0051;
value = value.Truncate(2);
Philippe Mori
Этот код слишком сложен по сравнению, скажем, с решением 3... и он не будет надежным, так как он потерпит неудачу, если десятичный разделитель не является точкой или для некоторых аргументов (меньше одного десятичного знака, большого или малого числа...).
#realJSOP
Согласно его примеру и заявленным требованиям, код, который я предоставил, в порядке. Если ему нужен специфический для культуры код, я уверен, что он спросит здесь, прежде чем пытаться разобраться в этом самостоятельно.
Philippe Mori
Ну, проблема в том, что это может привести к тонким ошибкам. Скажем, что входное число равно 1.23e-10
, то выход будет 1.23
вместо 0.00
Кроме того, в таком коде вы должны убедиться, что используется инвариантная культура. Такой код приводит к ошибкам, например, веб-сайт работает на английском языке, но не на французском (или наоборот). И часто программист работает только на одном языке и, возможно, с хорошими данными... так что такого рода проблемы могут быть не обнаружены перед отправкой, если у вас нет отдела контроля качества.
Рейтинг:
17
mufeed k
я имею в виду, что мое двойное значение равно 18.0051, и я хочу округлить его до 18.00 (после 2 десятичных знаков)
KARTHICKEYANRAJU
Вы имели в виду потолок или пол? Проверьте ниже один
https://msdn.microsoft.com/en-us/library/zx4t0t48(v=против 110). aspx
Первый этаж значение и преобразование в float
#realJSOP
Это не то, чего он хочет (если я правильно понял его вопрос). Если его значение "18.12345", он получит" 18.00", если сделает это по-вашему. Он хочет "18.12".