C#で最も近い整数に丸める方法


回答:


200

詳細については、公式ドキュメントを参照してください。例えば:

基本的に、Math.Roundメソッドには3つのパラメーターを指定します。

  1. 丸めたい値。
  2. 値の後に保持する小数点以下の桁数。
  3. AwayFromZeroの丸めを使用するために呼び出すことができるオプションのパラメーター。(丸めが曖昧でない限り無視されます。例:1.5

サンプルコード:

var roundedA = Math.Round(1.1, 0); // Output: 1
var roundedB = Math.Round(1.5, 0, MidpointRounding.AwayFromZero); // Output: 2
var roundedC = Math.Round(1.9, 0); // Output: 2
var roundedD = Math.Round(2.5, 0); // Output: 2
var roundedE = Math.Round(2.5, 0, MidpointRounding.AwayFromZero); // Output: 3
var roundedF = Math.Round(3.49, 0, MidpointRounding.AwayFromZero); // Output: 3

ライブデモ

あなたは必要とするMidpointRounding.AwayFromZeroあなたは0.5値は切り上げしたい場合。残念ながら、これはのデフォルトの動作ではありませんMath.Round()MidpointRounding.ToEven(デフォルト)を使用する場合、値は最も近い偶数に丸められます(1.5はに丸められますが2、に2.5も丸められます2)。


14
一方、を使用away from zeroすると、-1.5に丸められ-2ます。
ダボゴットランド2012年

2
使用Math.Ceiling、摩擦のために恐らくMath.roundを使用するには、そのことをお勧め、読み:stackoverflow.com/questions/9221205/...を
Yakirマナー

3
Math.Round(1.5、0)が2を返すことがわかりました
David Sykes

@davogotlandは138ではなく137.5から140に丸めます。私は最も近い10分の1に丸めることを意味しますか?
sam

1
@samはおそらく10で割り、Math.Ceilingで丸め、最後に10で倍数にしますか?
ダボゴットランド2017年

63
Math.Ceiling

常に切り上げます(天井に向かって)

Math.Floor

常に切り捨てます(床に向かって)

あなたが求めているのは単に

Math.Round

この投稿に従って丸めます


彼らはとにかく137.5から140を138に丸めるのではないですか 私は最も近い10分の1に丸めることを意味しますか?
sam

7

必要Math.RoundではありませんMath.CeilingCeiling常に「切り上げ」Round、小数点以下の値に応じて切り上げまたは切り下げを行います。


6

このマニュアルと、ちょっとかわいい方法もあります:

double d1 = 1.1;
double d2 = 1.5;
double d3 = 1.9;

int i1 = (int)(d1 + 0.5);
int i2 = (int)(d2 + 0.5);
int i3 = (int)(d3 + 0.5);

任意の数に0.5を追加し、それをint(またはフロア)にキャストすると、数学的に正しく丸められます:D


まだ疑わしく見えます。最初に、質問は切り上げについて尋ねます。次に、今試したところ、Math.Round(1.5)のデフォルト実装は2に丸められます。したがって、これは彼が望んでいたことではないかもしれません。

また、この例では、小数点と小数点コンマを組み合わせています。普段はどちらを使用していますか(スウェーデンでは):)
2012年

おっと...ああ、すみません。もちろん小数点のプログラミングでは、しかし正式なテキストでは小数点のコンマを使用します。そして、はい、スウェーデン語^^と、「端数を切り上げる」部分についてです。それは、単なる言語の誤りだと思います。opの例では、一部の10進数は切り捨てられます。
ダボゴットランド

@ver。Math.Roundで切り捨てないで、キャストで行います。だから、この方法は手作業でちょっとかわいいです;)
davogotland

5

他の人が提案したように(推奨)、Math.Roundを使用できます。または、0.5を追加してintにキャストすることもできます(小数部が削除されます)。

double value = 1.1;
int roundedValue = (int)(value + 0.5); // equals 1

double value2 = 1.5;
int roundedValue2 = (int)(value2 + 0.5); // equals 2

5

ただのリマインダーです。ダブルに注意してください。

Math.Round(0.3 / 0.2 ) result in 1, because in double 0.3 / 0.2 = 1.49999999
Math.Round( 1.5 ) = 2

3

Math.Round関数があり、まさに望みどおりのことを行います。

Math.Round(1.1) results with 1
Math.Round(1.8) will result with 2.... and so one.

1
1.5値としてはどうですか?さらにパラメータが必要です。
ボリビア人のみここ

2

これは、最も近い5に切り上げられるか、すでに5で割り切れる場合は変更されません。

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}

2

私はこれを探していましたが、私の例では、4.2769などの数値を使用して、4.3としてスパンにドロップしました。まったく同じではありませんが、これが役立つ場合:

Model.Statistics.AverageReview   <= it's just a double from the model

次に:

@Model.Statistics.AverageReview.ToString("n1")   <=gives me 4.3
@Model.Statistics.AverageReview.ToString("n2")   <=gives me 4.28

等...


文字列も必要で、.ToString( "n0")が丸めを処理してくれるので、この方法を使用しています。1.5m.ToString( "n0")// "2"を返します
Nathan Prather



0

浮動小数点数ではなく整数を使用する場合は、次のようにします。

#define ROUNDED_FRACTION(numr,denr) ((numr/denr)+(((numr%denr)<(denr/2))?0:1))

ここで、「numr」「denr」どちらも符号なし整数です。



0

独自の丸めメソッドを記述します。何かのようなもの、

function round(x) rx = Math.ceil(x) if (rx - x <= .000001) return int(rx) else return int(x) end


-1
decimal RoundTotal = Total - (int)Total;
if ((double)RoundTotal <= .50)
   Total = (int)Total;
else
   Total = (int)Total + 1;
lblTotal.Text = Total.ToString();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.