가장 가까운 0.5로 반올림하려면 어떻게합니까?


102

등급을 표시해야하는데 다음과 같이 증분이 필요합니다.

숫자가 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 과 같아야합니다 .

필요한 값을 계산하는 간단한 방법이 있습니까?


"등 ..."에는 표현 가능한 최대 값에 가까운 유한 숫자가 포함됩니까?
chux-Monica 복원

답변:


206

평점에 2를 곱한 다음를 사용하여 반올림 Math.Round(rating, MidpointRounding.AwayFromZero)한 다음 해당 값을 2로 나눕니다.

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


4
나는 인형을 위해 타이핑 할 필요가 없다, 나는 스마티를 위해 타이핑을 필요로한다
Neil N

3
완벽하지 않습니다! 정수 오버플로는 어떻습니까! 가능한 정수의 절반 만 계산할 수 있습니다.
Elazar Leibovich

2
@Elazar-만약 당신이 1,073,741,823 위로 랭크 될 수 있다면, 그것이 정말로 문제라면 그것이 "10 억 1.5"또는 "10 억 1"인지 신경 쓰는 단일 사용 사례를 생각할 수 없습니다. 그런 다음 순위 체계에 본질적으로 결함이 있습니다. :)
John Rasch

4
먼저 나눈 다음 곱하십시오. 이렇게하면 오버플로 문제가 제거되고 임의의 숫자로 반올림 할 수 있습니다.
Benjol 2013 년

8
@Benjol, 먼저 나눈 다음 반올림하면 반의 계수가 아닌 가장 가까운 계수 2로 반올림됩니다. 정확하지 않습니다.
Nacht 2015

67

2를 곱하고 반올림 한 다음 2로 나눕니다.

가장 가까운 분기를 원하면 4로 곱하고 4로 나누기 등


16

다음은 항상 임의의 값으로 반올림하거나 내림하는 몇 가지 방법입니다.

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

2

몇 가지 옵션이 있습니다. 성능이 문제라면 대형 루프에서 가장 빠르게 작동하는 것이 무엇인지 테스트하십시오.

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

이것은 작동하지만 주어진 일부 솔루션만큼 우아하지는 않습니다. 시스템 라이브러리를 곱하고 사용하는 것은 섹시합니다.
captncraig 09 년

일반적으로 성능이 더 중요하며 곱셈 및 나눗셈 솔루션보다 시간이 적게 걸릴 수 있습니다.
John Fisher

3
이 코드는 올바르지 않습니다. 복식을 사용한 산술에는 일반적으로 약간의 반올림 오류가 있으므로 4.8-4.0과 같은 연산은 예를 들어 0.799999 ...를 줄 수 있습니다. 이 경우 위의 코드는 4.5로 반올림됩니다. 또한 현재 음수가 반올림되지 않기 때문에 Math.Truncate 대신 Math.Floor를 사용하는 것이 좋습니다. 더 간단하고 구현 오류가 적기 때문에 받아 들여지는 대답을 선호합니다.
Accipitridae

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

1

가장 가까운 0.5로 반올림해야하는 것 같습니다. 버전이 없습니다.round 을 수행하는 C # API의 버전이 없습니다 (한 버전은 반올림 할 소수 자릿수를 사용하지만 동일한 것은 아닙니다).

10 분의 1의 정수만 처리하면된다고 가정하면 round (num * 2) / 2. 임의로 정확한 소수를 사용하는 경우 더 까다로워집니다. 그러지 않기를 바랍니다.


0

나는이 문제에도 어려움을 겪었다. 저는 주로 Adobe Flash Platform의 기본 코딩 인 Actionscript 3.0으로 코딩하지만 언어에는 유사점이 있습니다.

내가 생각 해낸 해결책은 다음과 같습니다.

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

그게 다야. '숫자'와 '정수'의 사용과 처리 방식에 유의하십시오.

행운을 빕니다!


0
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

4
이 코드는 질문에서 원하는대로 C #처럼 보이지 않습니다. 그것은 무엇을합니까? 지정되지 않은 언어로 된 코드 덩어리보다는 설명을 제공하십시오.
AdrianHHH

-1

이를 수행하는 올바른 방법은 다음과 같습니다.

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

                return finalPrice;

            }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.