Как округлить на любое число в C #? - PullRequest
0 голосов
/ 02 ноября 2018

Я нахожусь в процессе создания калькулятора в C #, и я хочу округлить до ближайших 1, 10, 100 и т. Д., А также как ближайший 0,1, 0,001 и т. Д. Я видел другие проекты, которые говорят мне, как это сделать но я пытался, и они, кажется, не работают.

Я пробовал:

textBox1.Text = Convert.ToString(Math.Round(Convert.ToDouble(Label1.Text), Convert.ToInt32(textBox1.Text), MidpointRounding.AwayFromZero));

и ...

textBox1.Text = Convert.ToString(Math.Round(Convert.ToDouble(Label1.Text), Convert.ToInt32(textBox1.Text)));

и ...

textBox1.Text = Convert.ToString(Convert.ToInt32(Label1.Text) / Convert.ToInt32(textBox1.Text) * Convert.ToInt32(textBox1.Text));

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Вы можете создать метод Extension, используя ту же идею из ответа Джонатона. Вы делите входные данные на выбранный интервал, округляете его, используя Math.Round, а затем умножаете округленное число на интервал.

static class Extensions
{
    public static int RoundToInterval(this int i, int interval)
    {
        if (interval == 0)
        {
            throw new ArgumentException("The specified interval cannot be 0.", nameof(interval));
        }
        return ((int)Math.Round((double)i / (double)interval)) * interval;
    }
}

Называя это будет выглядеть так.

int input = 13;
var result = input.RoundToInterval(10);

Результат предыдущего примера вызова будет 10. Измените input на 16, и результат будет 20. Если вы передадите 100 в качестве аргумента RoundToInterval, результатом будет 0, а 51 (и 50 с выбором MidpointRounding по умолчанию) даст результат 100.

0 голосов
/ 02 ноября 2018

Math.Round имеет перегрузки, которые позволяют округлять до определенного десятичного знака.

, например

Math.Round(0.05, 1, MidpointRounding.AwayFromZero);

приведет к 0,1

Если вы хотите округлить до ближайших 10, 100 и т. Д., Вам нужно сделать немного больше математики.

Math.Round((double)50 / 100, MidpointRounding.AwayFromZero) * 100;

приводит к 100 для округления до ближайшей сотни, тогда как

Math.Round((double)55 / 10, MidpointRounding.AwayFromZero) * 10;

приведет вас к ближайшим 10, в данном случае 60.

...