C#で数値を小数点以下2桁に丸めるにはどうすればよいですか?


回答:


629

ここにいくつかの例があります:

decimal a = 1.994444M;

Math.Round(a, 2); //returns 1.99

decimal b = 1.995555M;

Math.Round(b, 2); //returns 2.00

次のオーバーロードを使用して、銀行の丸め/四捨五入を確認することもできます。

Math.Round(a, 2, MidpointRounding.ToEven);

詳しくはこちらをご覧ください


51
MidPointRounding.ToEvenがデフォルトであることを明確にする必要があります。
AwayFromZero

5
あなたがしたい場合は切り上げる 2桁まで、追加0.005丸める前の番号に。同様に、切り捨てるために、関数0.005に渡す前に減算しMath.Roundます。
15

4
.NETのデフォルトがMidPointRounding.ToEven(「バンカーの丸め」とも呼ばれます)である理由は、私たち全員が学校で丸めを学習したためです。これは、お金や税金の計算などを処理するときに問題になります
asporter '11 / 11/11


33

個人的には何も丸めません。いずれにしても、丸めはCSでの赤いニシンのビットであるため、できるだけ断固としてください。しかし、ユーザーのためにデータをフォーマットしたいのですstring.Format("{0:0.00}", number)が、そのためには、それが良いアプローチだと思います。


£5.4(Math.roundの場合)が£5.40(この方法)のように見えないため、これは表示目的、特にお金の場合によりよく機能します。
Peter Gordon

string.Format( "0:0.00"、number)の前に試しましたが、機能しませんでした。これらの角括弧は非常に重要であるため、string.Format( "{0:0.00}"、number)が機能します。
FrenkyB、2015年

8
@FrenkyBあなたが「角括弧」と言うとき、私はあなたが中括弧を意味することを望みます。
Mathemats

これも丸めます。1.009 => 1.01
Donny V.

30

文字列をご希望の場合

> (1.7289).ToString("#.##")
"1.73"

または小数

> Math.Round((Decimal)x, 2)
1.73m

でも覚えておいて!丸めは分散的ではありません。round(x*y) != round(x) * round(y)。したがって、計算の最後まで丸めを行わないでください。丸めると、精度が失われます。


14

ウィキペディアには、概して丸めに関する素晴らしいページがあります

すべての.NET(マネージ)言語は、共通言語ランタイム(CLR)の丸めメカニズムを使用できます。たとえば、Math.Round()(上記のとおり)メソッドを使用すると、開発者は丸めのタイプ(Round-to-evenまたはAway-from-zero)を指定できます。Convert.ToInt32()メソッドとそのバリエーションは、round-to-evenを使用します。天井()床()メソッドが関連しています。

カスタム数値フォーマットで丸めることもできます。

Decimal.Round()Math.Round()とは異なるメソッドを使用することに注意してください。

銀行員の丸めアルゴリズムの便利な例を以下に示します。丸めに関するレイモンドのユーモラスな投稿の1つをここで参照してください...


13

//小数点以下2桁まで変換します

String.Format("{0:0.00}", 140.6767554);        // "140.67"
String.Format("{0:0.00}", 140.1);             // "140.10"
String.Format("{0:0.00}", 140);              // "140.00"

Double d = 140.6767554;
Double dc = Math.Round((Double)d, 2);       //  140.67

decimal d = 140.6767554M;
decimal dc = Math.Round(d, 2);             //  140.67

=========

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

「0」と「#」を組み合わせることもできます。

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

1
String.Format( "{0:0.00}"、140.6767554); != "140.67"実際には "140.68"としてレンダリングされます-切り上げ
AndyT

7

私は古い質問を知っていますが、数学のラウンド文字列形式のラウンドの次の違いに注意してください:

decimal d1 = (decimal)1.125;
Math.Round(d1, 2).Dump();   // returns 1.12
d1.ToString("#.##").Dump(); // returns "1.13"

decimal d2 = (decimal)1.1251;
Math.Round(d2, 2).Dump();   // returns 1.13
d2.ToString("#.##").Dump(); // returns "1.13"

6

これは、C#で小数点以下2桁に丸めるためのものです。

label8.Text = valor_cuota .ToString("N2") ;

VB.NETの場合:

 Imports System.Math
 round(label8.text,2)

5

数値を丸めたい場合は、次の条件に応じて異なる結果を得ることができます。Math.Round()関数の使用方法(切り上げまたは切り捨ての場合)、doubleおよび/またはfloatの数値を使用している、そしてあなたは中点丸めを適用します。特に、その内部の演算で使用する場合、または丸める変数は演算から取得されます。たとえば、0.75 * 0.95 = 0.7125の 2つの数値を乗算するとします。正しい?C#ではない

3桁に四捨五入したい場合はどうなるか見てみましょう。

double result = 0.75d * 0.95d; // result = 0.71249999999999991
double result = 0.75f * 0.95f; // result = 0.71249997615814209

result = Math.Round(result, 3, MidpointRounding.ToEven); // result = 0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = 0.712. Should be 0.713

ご覧のとおり、中点を切り捨てる場合は、最初のRound()が適切です。しかし、2番目のRound()は、切り上げたい場合は誤りです。

これは負の数に適用されます:

double result = -0.75 * 0.95;  //result = -0.71249999999999991
result = Math.Round(result, 3, MidpointRounding.ToEven); // result = -0.712. Ok
result = Math.Round(result, 3, MidpointRounding.AwayFromZero); // result = -0.712. Should be -0.713

したがって、私見では、Math.Round()の独自のラップ関数を作成して、要件に合わせる必要があります。パラメータ 'roundUp = true'が次に大きい数値に丸めることを意味する関数を作成しました。つまり、0.7125は0.713に丸められ、-0.7125は-0.712に丸められます(-0.712> -0.713であるため)。これは私が作成した関数であり、任意の桁数で機能します。

double Redondea(double value, int precision, bool roundUp = true)
{
    if ((decimal)value == 0.0m)
        return 0.0;

    double corrector = 1 / Math.Pow(10, precision + 2);

    if ((decimal)value < 0.0m)
    {
        if (roundUp)
            return Math.Round(value, precision, MidpointRounding.ToEven);
        else
            return Math.Round(value - corrector, precision, MidpointRounding.AwayFromZero);
    }
    else
    {
        if (roundUp)
            return Math.Round(value + corrector, precision, MidpointRounding.AwayFromZero);
        else
            return Math.Round(value, precision, MidpointRounding.ToEven);
    }
}

変数 'c​​orrector'は、浮動小数点数または倍精度数での操作の不正確さを修正するためのものです。






1

10進数の変数がある奇妙な状況で、55.50をシリアル化すると常に数学的にデフォルト値が55.5に設定されます。しかし、私たちのクライアントシステムは何らかの理由で55.50を真剣に期待しており、間違いなく10進数を期待しています。それは私が以下のヘルパーを書いたときでした、それは常に文字列を送る代わりにゼロで2桁に埋め込まれた10進値を変換します。

public static class DecimalExtensions
{
    public static decimal WithTwoDecimalPoints(this decimal val)
    {
        return decimal.Parse(val.ToString("0.00"));
    }
}

使用法は

var sampleDecimalValueV1 = 2.5m;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

decimal sampleDecimalValueV1 = 2;
Console.WriteLine(sampleDecimalValueV1.WithTwoDecimalPoints());

出力:

2.50
2.00

0
  public double RoundDown(double number, int decimalPlaces)
        {
            return Math.Floor(number * Math.Pow(10, decimalPlaces)) / Math.Pow(10, decimalPlaces);
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.