Как мне округлить до ближайшего 0,5? - PullRequest
86 голосов
/ 25 августа 2009

Мне нужно отобразить рейтинги, и для этого мне нужны следующие приращения:

Если число равно 1,0, оно должно быть равно 1
Если число 1.1 должно быть равно 1
Если число 1,2 должно быть равно 1
Если число 1,3 должно быть равно 1,5
Если число 1,4 должно быть равно 1,5
Если число 1,5 должно быть равно 1,5
Если число 1,6 должно быть равно 1,5
Если число равно 1,7, оно должно быть равно 1,5
Если число равно 1,8, оно должно быть равно 2,0
Если число 1.9 должно быть равно 2.0
Если число 2.0 должно быть равно 2.0
Если число равно 2,1, оно должно быть равно 2,0
и так далее ...

Есть ли простой способ вычислить требуемые значения?

Ответы [ 9 ]

183 голосов
/ 25 августа 2009

Умножьте свой рейтинг на 2, затем округлите, используя Math.Round(rating, MidpointRounding.AwayFromZero), затем разделите это значение на 2.

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

60 голосов
/ 25 августа 2009

Умножьте на 2, округлите, затем разделите на 2

если вы хотите ближайший квартал, умножьте на 4, разделите на 4 и т. Д.

14 голосов
/ 16 ноября 2010

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

public static Double RoundUpToNearest(Double passednumber, Double roundto)
{
    // 105.5 up to nearest 1 = 106
    // 105.5 up to nearest 10 = 110
    // 105.5 up to nearest 7 = 112
    // 105.5 up to nearest 100 = 200
    // 105.5 up to nearest 0.2 = 105.6
    // 105.5 up to nearest 0.3 = 105.6

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Ceiling(passednumber / roundto) * roundto;
    }
}

public static Double RoundDownToNearest(Double passednumber, Double roundto)
{
    // 105.5 down to nearest 1 = 105
    // 105.5 down to nearest 10 = 100
    // 105.5 down to nearest 7 = 105
    // 105.5 down to nearest 100 = 100
    // 105.5 down to nearest 0.2 = 105.4
    // 105.5 down to nearest 0.3 = 105.3

    //if no rounto then just pass original number back
    if (roundto == 0)
    {
        return passednumber;
    }
    else
    {
        return Math.Floor(passednumber / roundto) * roundto;
    }
}
1 голос
/ 25 августа 2009

Похоже, вам нужно округлить до ближайшего 0,5. Я не вижу версии round в C # API, которая бы это делала (одна версия принимает число десятичных цифр для округления, что не одно и то же).

Предполагая, что вам нужно иметь дело только с целыми числами десятых, достаточно вычислить round (num * 2) / 2. Если вы используете произвольно точные десятичные дроби, это становится сложнее. Будем надеяться, что вы этого не сделаете.

1 голос
/ 25 августа 2009

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

double Adjust(double input)
{
    double whole = Math.Truncate(input);
    double remainder = input - whole;
    if (remainder < 0.3)
    {
        remainder = 0;
    }
    else if (remainder < 0.8)
    {
        remainder = 0.5;
    }
    else
    {
        remainder = 1;
    }
    return whole + remainder;
}
1 голос
/ 25 августа 2009
decimal d = // your number..

decimal t = d - Math.Floor(d);
if(t >= 0.3d && t <= 0.7d)
{
    return Math.Floor(d) + 0.5d;
}
else if(t>0.7d)
    return Math.Ceil(d);
return Math.Floor(d);
0 голосов
/ 25 января 2017
Public Function Round(ByVal text As TextBox) As Integer
    Dim r As String = Nothing
    If text.TextLength > 3 Then
        Dim Last3 As String = (text.Text.Substring(text.Text.Length - 3))
        If Last3.Substring(0, 1) = "." Then
            Dim dimcalvalue As String = Last3.Substring(Last3.Length - 2)
            If Val(dimcalvalue) >= 50 Then
                text.Text = Val(text.Text) - Val(Last3)
                text.Text = Val(text.Text) + 1
            ElseIf Val(dimcalvalue) < 50 Then
                text.Text = Val(text.Text) - Val(Last3)
            End If
        End If
    End If
    Return r
End Function
0 голосов
/ 26 февраля 2014

Правильный способ сделать это:

  public static Decimal GetPrice(Decimal price)
            {
                var DecPrice = price / 50;
                var roundedPrice = Math.Round(DecPrice, MidpointRounding.AwayFromZero);
                var finalPrice = roundedPrice * 50;

                return finalPrice;

            }
0 голосов
/ 18 ноября 2009

У меня тоже были проблемы с этой проблемой. Я кодирую в основном в ActionScript 3.0, который является базовым для Adobe Flash Platform, но в языках есть сходства:

Я пришел к следующему решению:

//Code for Rounding to the nearest 0.05
var r:Number = Math.random() * 10;  // NUMBER - Input Your Number here
var n:int = r * 10;   // INTEGER - Shift Decimal 2 places to right
var f:int = Math.round(r * 10 - n) * 5;// INTEGER - Test 1 or 0 then convert to 5
var d:Number = (n + (f / 10)) / 10; //  NUMBER - Re-assemble the number

trace("ORG No: " + r);
trace("NEW No: " + d);

Вот и все. Обратите внимание на использование «Чисел» и «Целых чисел» и способа их обработки.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...