web-dev-qa-db-ja.com

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

値を最も近い整数に丸めるにはどうすればよいですか?

例えば:

1.1 => 1
1.5 => 2
1.9 => 2

「Math.Ceiling()」は私を助けてくれません。何か案は?

81
SOF User

詳しくは 公式ドキュメント をご覧ください。例えば:

基本的に、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

ライブデモ

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

179
Math.Ceiling

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

Math.Floor

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

あなたが望んでいるのは単に

Math.Round

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

58
devrooms

Math.Roundではなく、Math.Ceilingが必要です。 Ceilingは常に「切り上げ」られますが、Roundは小数点以下の値に応じて切り上げまたは切り捨てられます。

7
dasblinkenlight

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

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

6
davogotland

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

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

他の人が示唆しているように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
4
Marlon

まさにあなたが望むことをするMath.Round関数があります。

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

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

public static double R(double x)
{
    // markup to nearest 5
    return (((int)(x / 5)) * 5) + ((x % 5) > 0 ? 5 : 0);
}
2
rick
var roundedVal = Math.Round(2.5, 0);

結果が得られます:

var roundedVal = 3
1

私はこれを探していましたが、私の例は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

等...

1
user2970629

Math.Round を使用します。

double roundedValue = Math.Round(value, 0)
1
Thomas Levesque

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

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

0
Sandeep Anand

Math.Round(number)を使用すると、最も近い整数に丸められます。

0
John Kennedy

浮動小数点数ではなく整数で作業する場合、次の方法があります。

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

ここで"numr""denr"は両方とも符号なし整数です。

0
Sarath Kumar