Как округлить число до двух десятичных знаков в C #? - PullRequest
328 голосов
/ 02 ноября 2008

Я хочу сделать это, используя функцию Math.Round

Ответы [ 14 ]

1 голос
/ 27 ноября 2015

string a = "10.65678";

десятичный d = Math.Round (Convert.ToDouble (a.ToString ()), 2)

0 голосов
/ 09 мая 2019

Если вы хотите округлить число, вы можете получить разные результаты в зависимости от: как вы используете функцию Math.Round () (если для округления вверх или вниз), вы работаете с двойными и / или числа с плавающей запятой, и вы применяете округление средней точки. Особенно, когда используется с операциями внутри него или переменная для округления происходит от операции. Допустим, вы хотите умножить эти два числа: 0,75 * 0,95 = 0,7125 . Правильно? Не в C #

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

double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209

result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713

Как видите, первый раунд () правильный, если вы хотите округлить среднюю точку. Но второй раунд () это неправильно, если вы хотите округлить.

Это относится к отрицательным числам:

double result = -0.75 * 0.95;  //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713

Итак, ИМХО, вы должны создать свою собственную функцию переноса для Math.Round (), которая соответствует вашим требованиям. Я создал функцию, в которой параметр roundUp = true означает округление до следующего большего числа. То есть: 0,7125 раундов до 0,713 и -0,7125 раундов до -0,712 (потому что -0,712> -0,713). Это функция, которую я создал и работает для любого количества десятичных знаков:

double Redondea(double value, int precision, bool roundUp = true)
{
    if ((decimal)value == 0.0m)
        return 0.0;

    double corrector = 1 / Math.Pow(10, precision + 2);

    if ((decimal)value < 0.0m)
    {
        if (roundUp)
            return Math.Round(value, precision, MidpointRounding.ToEven);
        else
            return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
    }
    else
    {
        if (roundUp)
            return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
        else
            return Math.Round(value, precision, MidpointRounding.ToEven);
    }
}

Переменная 'corrector' предназначена для исправления неточностей работы с плавающими или двойными числами.

0 голосов
/ 30 сентября 2017

Math.Floor (123456.646 * 100) / 100 Вернул бы 123456,64

0 голосов
/ 28 июня 2017
  public double RoundDown(double number, int decimalPlaces)
        {
            return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
        }
...