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

Если Вы волнуетесь по поводу удобочитаемости своего кода, добавьте комментарий для напоминания себе, какой и почему Вы делаете это.

9
задан Bret Walker 14 September 2009 в 18:09
поделиться

6 ответов

На самом деле вы не в середине. MidpointRounding.ToEven указывает, что если бы у вас было число 99.965 , то есть 99.96500000 [и т. Д.], , то вы получили бы 99.96. Поскольку число, которое вы передаете в Math.Round, находится выше этой средней точки, оно округляется в большую сторону.

Если вы хотите, чтобы ваше число округлялось до 99,96, сделайте следующее:

// this will round 99.965 down to 99.96
return Math.Round(Math.Truncate(99.96535789*1000)/1000, 2, MidpointRounding.ToEven);

А вот и небольшая удобная функция. приведенное выше для общих случаев:

// This is meant to be cute;
// I take no responsibility for floating-point errors.
double TruncateThenRound(double value, int digits, MidpointRounding mode) {
    double multiplier = Math.Pow(10.0, digits + 1);
    double truncated = Math.Truncate(value * multiplier) / multiplier;
    return Math.Round(truncated, digits, mode);
}
25
ответ дан 4 December 2019 в 06:16
поделиться

Округляется до 99,96, только если вы находитесь в самой средней точке, то есть 99,965:

C:\temp>ipy
IronPython 2.6 Beta 2 (2.6.0.20) on .NET 2.0.50727.4927
Type "help", "copyright", "credits" or "license" for more information.
>>> import clr
>>> from System import Math, MidpointRounding
>>> Math.Round(99.9651, 2, MidpointRounding.ToEven)
99.97
>>> Math.Round(99.965, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.9649, 2, MidpointRounding.ToEven)
99.96
>>> Math.Round(99.975, 2, MidpointRounding.ToEven)
99.98
>>>
9
ответ дан 4 December 2019 в 06:16
поделиться

Значение MidpointRounding вступает в игру только тогда, когда вы пытаетесь округлить значение, у которого младшая цифра ровно 5. Другими словами, значение должно быть 99,965 , чтобы получить желаемый результат. Поскольку здесь это не так, вы просто наблюдаете стандартный механизм округления. Дополнительную информацию см. На странице MSDN .

4
ответ дан 4 December 2019 в 06:16
поделиться

Вот результаты, которые проливают свет на эту тему:

Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97
Math.Round(99.965, 2, MidpointRounding.ToEven);      // returning 99.96
Math.Round(99.96500000, 2, MidpointRounding.ToEven); // returning 99.96

Средняя точка точно равна 5 ... не 535789, не 499999.

3
ответ дан 4 December 2019 в 06:16
поделиться

Math.Round 'Округляет десятичное значение до указанного числа дробных знаков.' при округлении 99,96500000,2 округляется до 99,96 и 99,96500001 до 99,67. Округляет полное значение.

0
ответ дан 4 December 2019 в 06:16
поделиться

Округление средней точки рассматривается только в том случае, если значение находится между двумя вашими случаями.

В вашем случае это не «5», а «535 ...», поэтому оно больше средней точки, а процедуры - 0,96. Чтобы добиться ожидаемого поведения, необходимо выполнить усечение до третьей десятичной точки, ЗАТЕМ округлить с помощью MidpointRounding.ToEven.

0
ответ дан 4 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: