Вопрос

Я не вижу результата, которого ожидаю от математики.Раунд.

return Math.Round(99.96535789, 2, MidpointRounding.ToEven); // returning 99.97

Насколько я понимаю, округление средней точки.В довершение всего, 5 в тысячной позиции должно привести к тому, что результат будет равен 99,96.Разве это не тот случай?

Я даже попробовал это, но он также вернул 99,97:

return Math.Round(99.96535789 * 100, MidpointRounding.ToEven)/100;

Что я упускаю из виду

Спасибо!

Это было полезно?

Решение

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

Если вы хотите, чтобы ваше число округлилось в меньшую сторону до 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);
}

Другие советы

Он округляется до 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
>>>

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

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

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.

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

В вашем случае это не "5", а "535 ...", так что это больше средней точки и соответствует .96.Чтобы получить ожидаемое поведение, вам нужно будет сократить до третьей десятичной запятой, затем округлить, используя округление средней точки.До нуля.

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

Если бы это был я, я бы не использовал Math.Round(), потому что это не то, чего вы пытаетесь достичь.

Это то, что я бы сделал:

double num = 99.96535789;
double percentage = Math.Floor(100 * num) / 100;  

Который гораздо легче читается и представляет собой скорее математический подход.
Я умножаю это число на 100, теперь у меня есть 9996.535789.
Затем уменьшите его, что заметно отличается от округления, чтобы вернуть наименьшее целое число, ближайшее к числу, чтобы получить 9996.
Затем я делю на 100 чтобы получить необходимые 99.96.

P.S.
Этаж является противоположностью потолок, который возвращает наибольшее целое число, ближайшее к данному числу.
Итак, потолок 9996.535789 является 9997.
И то, и другое отличается от округление без десятичных знаков, что фактически возвращает ближайшее целое число к числу, независимо от того, меньше оно или больше - в зависимости от того, что ближе;вот почему вы получали 99.97 когда вы использовали округление.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top