Округление десятичной дроби до двух знаков после запятой - PullRequest
0 голосов
/ 18 июня 2020

У меня проблема с округлением числа до двух десятичных знаков.

У меня есть число 3106.4647771976413339683766317M.

Правильное округление до двух десятичных знаков - 3106,47, но с использованием Math.Round(value, 2, MidpointRounding.AwayFromZero) число 3106,46.

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

У кого-то есть что-то подобное?

Ответы [ 2 ]

3 голосов
/ 18 июня 2020

Математически правильное округление до двух десятичных знаков равно 3106,46.

То, что вам, вероятно, нужно, это потолок :

Math.Ceiling(3106.4647771976413339683766317M * 100) / 100

производит 3106,47. Не существует версии Math.Ceiling, принимающей количество знаков после запятой, поэтому есть умножение и деление.

Кроме того, обратите внимание, что в этом выражении есть оговорка:

Math.Round(value, 2, MidpointRounding.AwayFromZero) 

Math.Round не имеет варианта с тремя аргументами, где первый - decimal. Это работает, потому что значение неявно преобразуется в double. Однако это нежелательно.

0 голосов
/ 18 июня 2020

Если вы действительно хотите округлить этот путь (более распространенная ошибка, чем фактическое округление в традиционном смысле), вы можете округлить от самого дальнего правого di git и перемещаться влево на одно место за раз.

double numberToRound = 3106.4647771976413339683766317;

int placesToRoundTo = 2;
int smallestPlaceIndex = 24; // you would need to determine this value

for (int i = smallestPlaceIndex; i >= placesToRoundTo)
{
    numberToRound = Math.Round(numberToRound, i, MidpointRounding.AwayFromZero);
}

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

...