Как округлить до ближайшего 0,5?

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

Если число равно 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
и так далее...

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

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

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

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;
    }
}

Ответ 4

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);

Ответ 5

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

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;
}

Ответ 6

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

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

Ответ 7

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

Ответ 8

У меня также была проблема с этой проблемой. Я кодирую в основном в 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);

Это в значительной степени. Обратите внимание на использование "Числа" и "Целые числа" и способ их обработки.

Удачи!

Ответ 9

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

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

                return finalPrice;

            }