Округление до абсолютного целого числа [дубликат]

Вы можете просто попробовать этот метод -

let headers = new Headers({'Accept': 'application/json'});
let options = new RequestOptions({headers: headers});

return this.http
    .get(this.yourSearchUrlHere, options) // the URL which you have defined
    .map((res) => {
        res.json(); // using return res.json() will throw error
    }
    .catch(err) => {
        console.error('error');
    }
30
задан markzzz 31 October 2012 в 10:08
поделиться

8 ответов

Попробуйте метод Math.Round. Вот как это сделать:

Math.Round(76d / 100d, 0) * 100;
Math.Round(121d / 100d, 0) * 100;
Math.Round(9660d / 100d, 0) * 100;
58
ответ дан krizzzn 22 August 2018 в 07:58
поделиться
  • 1
    Это самое простое решение для понимания из партии. +1! Вы не требуете перегрузки, чтобы указать 0. Может быть, вы могли бы использовать перегрузку средней точки – nawfal 31 October 2012 в 10:42
  • 2
    Для этого используйте десятичную, а не двойную. – CodesInChaos 29 July 2014 в 07:06
  • 3
    Я не думаю, что это работает так, как ожидают многие люди! Math.Round усекает значение, поэтому Math.Round(50d / 100d, 0) будет 0. Некоторые люди могут ожидать, что оно будет 100. – Jim Aho 5 April 2016 в 08:41
  • 4
    Когда вы ожидаете, что 50/100 раундов к одному, вы можете использовать перегрузку Math.Round(decimal d, int decimals, MidpointRounding mode): Math.Round(50d / 100d, 0, MidpointRounding.AwayFromZero); – krizzzn 5 April 2016 в 13:38
  • 5
    Ой. Я только что увидел, что @JimAho добавил ответ на этот вопрос, который показывает, как использовать MidpointRounding перечисление ( stackoverflow.com/a/36421665/964821 ) – krizzzn 5 April 2016 в 13:41

Просто добавление к принятому ответу @krizzzn ...

Обратите внимание, что следующее возвращается 0:

Math.Round(50d / 100d, 0) * 100;

Рассмотрим используя следующее и вместо этого верните 100:

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

В зависимости от того, что вы делаете, использование десятичных знаков может быть лучшим выбором (обратите внимание на m):

Math.Round(50m / 100m, 0, MidpointRounding.AwayFromZero) * 100m;
7
ответ дан Community 22 August 2018 в 07:58
поделиться

Если вы хотите только округлить числовые числа вверх (как это делал OP фактически), вы можете прибегнуть к этому решению:

public static class MathExtensions
{
    public static int RoundUpTo(this int number, int nearest)
    {
        if (nearest < 10 || nearest % 10 != 0)
            throw new ArgumentOutOfRangeException(nameof(nearest), $"{nameof(nearest)} must be a positive multiple of 10, but you specified {nearest}.");

        int modulo = number % nearest;
        return modulo == 0 ? number : modulo > 0 ? number + (nearest - modulo) : number - modulo;
    }
}

Если вы хотите выполнить с плавающей запятой (или десятичной) округлить, затем прибегнуть к ответам @krizzzn и @Jim Aho.

0
ответ дан feO2x 22 August 2018 в 07:58
поделиться

Я написал простой метод расширения для обобщения такого рода округления некоторое время назад:

public static class MathExtensions
{
    public static int Round(this int i, int nearest)
    {
        if (nearest <= 0 || nearest % 10 != 0)
            throw new ArgumentOutOfRangeException("nearest", "Must round to a positive multiple of 10");

        return (i + 5 * nearest / 10) / nearest * nearest;
    }
}

Он использует целочисленное деление для поиска ближайшего округления.

Пример использования:

int example = 152;
Console.WriteLine(example.Round(100)); // round to the nearest 100
Console.WriteLine(example.Round(10)); // round to the nearest 10

И в вашем примере:

Console.WriteLine(76.Round(100)); // 100
Console.WriteLine(121.Round(100)); // 100
Console.WriteLine(9660.Round(100)); // 9700
19
ответ дан Jason Larke 22 August 2018 в 07:58
поделиться

Привет, я пишу это расширение, это получает следующую сотню за каждый номер, который вы передаете

/// <summary>
    /// this extension gets the next hunfìdred for any number you whant
    /// </summary>
    /// <param name="i">numeber to rounded</param>
    /// <returns>the next hundred number</returns>
    /// <remarks>
    /// eg.:
    /// i =   21 gets 100
    /// i =  121 gets 200
    /// i =  200 gets 300
    /// i = 1211 gets 1300
    /// i = -108 gets -200
    /// </remarks>
    public static int RoundToNextHundred(this int i)
    {
        return i += (100 * Math.Sign(i) - i % 100);
        //use this line below if you want RoundHundred not NEXT
        //return i % 100 == byte.MinValue? i : i += (100 * Math.Sign(i) - i % 100);
    }

    //and for answer at title point use this algoritm
    var closeHundred = Math.Round(number / 100D)*100;

    //and here the extension method if you prefer

    /// <summary>
    /// this extension gets the close hundred for any number you whant
    /// </summary>
    /// <param name="number">number to be rounded</param>
    /// <returns>the close hundred number</returns>
    /// <remarks>
    /// eg.:
    /// number =   21 gets    0
    /// number =  149 gets  100
    /// number =  151 gets  200
    /// number = -149 gets -100
    /// number = -151 gets -200
    /// </remarks>
    public static int RoundCloseHundred(this int number)
    {
        return (int)Math.Round(number / 100D) * 100;
    }
1
ответ дан luka 22 August 2018 в 07:58
поделиться
  • 1
    Этот алгоритм фактически не округляется, но он ищет следующее значение, где value % 100 == 0, например. когда этот метод вызывается с i = 200, он возвращает 300. – feO2x 10 August 2017 в 13:04
  • 2
    И это не работает для отрицательных значений: когда этот метод вызывается с i = -4, тогда он возвращает 100, хотя я бы ожидал 0. – feO2x 10 August 2017 в 13:14
  • 3
    правильно, что это следующая сотня 200? 300 – luka 14 August 2017 в 07:51
  • 4
    Это не то, как работает округление - когда у меня уже есть значение 200, тогда оно не должно округляться до 300 (потому что 200 уже является квантованным значением шкалы округления). Если вы выполняете нормальное целочисленное округление, вы также не ожидаете, что следующее утверждение будет истинным: Math.Round (1) == 2 – feO2x 14 August 2017 в 07:58
  • 5
    Я вставляю отрицательное число, теперь, если вы вставляете отрицательное число, это получает следующую отрицательную сто – luka 14 August 2017 в 08:12

Попробуйте это выражение:

(n + 50) / 100 * 100
14
ответ дан Marcelo Cantos 22 August 2018 в 07:58
поделиться
  • 1
    Это правильный ответ. Вопрос о целых числах. – Enigmativity 14 August 2017 в 07:56

Я знаю, что это старая нить. Я написал новый метод. Надеюсь, это будет полезно для некоторых.

    public static double Round(this float value, int precision)
    {
        if (precision < -4 && precision > 15)
            throw new ArgumentOutOfRangeException("precision", "Must be and integer between -4 and 15");

        if (precision >= 0) return Math.Round(value, precision);
        else
        {
            precision = (int)Math.Pow(10, Math.Abs(precision));
            value = value + (5 * precision / 10);
            return Math.Round(value - (value % precision), 0);
        }
    }

Пример:

float value = F6666.677777;
Console.Write(value.Round(2)) // = 6666.68
Console.Write(value.Round(0)) // = 6667
Console.Write(value.Round(-2)) // = 6700 
5
ответ дан Raghu 22 August 2018 в 07:58
поделиться
int num = 9660;
int remainder = num % 100;
Console.WriteLine(remainder < 50 ? num - remainder : num + (100 -remainder));

Примечание: я не тестировал это полностью.

0
ответ дан shahkalpesh 22 August 2018 в 07:58
поделиться
Другие вопросы по тегам:

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