最も近い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-モニカを2018年

回答:


206

評価に2を掛け、次にを使用して丸めMath.Round(rating, MidpointRounding.AwayFromZero)、その値を2で割ります。

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


4
ダミーの場合は入力する必要はありません。スマーティーの場合は入力する必要があります
Neil N

3
完璧じゃない!整数オーバーフローはどうですか!可能な整数の半分しか計算できません。
Elazar Leibovich、

2
@エラザール-1,073,741,823位にランク付けできる場合、「10億1億半」または「10億1億」のどちらでも問題ない単一のユースケースは考えられません-それが本当に問題である場合次に、ランキングスキームに本質的に欠陥があるものがあります:)
John Rasch

4
最初に除算し、次に乗算します。これにより、オーバーフローの問題が解消され、任意の数値に丸めることもできます。
Benjol 2013年

8
@Benjol、最初に除算してから丸めると、2倍ではなく、最も近い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 2009

通常、パフォーマンスはより重要であり、乗算と除算のソリューションよりも時間がかかりません。
ジョンフィッシャー

3
このコードは正しくありません。doubleを使用した算術演算には通常、小さな丸め誤差があるため、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に四捨五入する必要があるように聞こえます。これを実行するバージョンがroundC#APIに表示されません(1つのバージョンは丸めに10進数を使用しますが、これは同じではありません)。

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 2017年

-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.