mufeed k Ответов: 4

Как округлить двойное значение после двух знаков после запятой в C#


мне нужно округлить свое двойное значение после 2 десятичных знаков.
то есть с 18.00 до 18.00
но когда я попробовал использовать math. round, он дал результат 18.01
пожалуйста кто нибудь помогите мне

Что я уже пробовал:

Математика.Раунд (18.0051, 2, MidpointRounding.AwayFromZero)
Математика.Раунд (18.0051, 2, MidpointRounding.ToEven)

Mehdi Gholam

Определение округления числа - до ближайшего числа, а .0051 ближе к .01, чем .0000

Philippe Mori

Ваш пример плохо выбран (как Math.Floor(18.0051) тоже бы отдал 18.00) и ваша формулировка неверна (усечение против округления).

#realJSOP

Если ваша ценность равна 18.1151, какую ценность вы в конечном счете хотите видеть? Судя по тому, как вы сформулировали свой вопрос, вы ожидаете "18.11". Это верно?

#realJSOP

Решение 3 - это тот ответ, который вам нужен.

4 Ответов

Рейтинг:
4

mufeed k

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


Рейтинг:
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".