回答:
ここにいくつかの例があります:
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);
詳しくはこちらをご覧ください。
0.005
丸める前の番号に。同様に、切り捨てるために、関数0.005
に渡す前に減算しMath.Round
ます。
MidPointRounding.ToEven
(「バンカーの丸め」とも呼ばれます)である理由は、私たち全員が学校で丸めを学習したためです。これは、お金や税金の計算などを処理するときに問題になります
個人的には何も丸めません。いずれにしても、丸めはCSでの赤いニシンのビットであるため、できるだけ断固としてください。しかし、ユーザーのためにデータをフォーマットしたいのですstring.Format("{0:0.00}", number)
が、そのためには、それが良いアプローチだと思います。
ウィキペディアには、概して丸めに関する素晴らしいページがあります。
すべての.NET(マネージ)言語は、共通言語ランタイム(CLR)の丸めメカニズムを使用できます。たとえば、Math.Round()(上記のとおり)メソッドを使用すると、開発者は丸めのタイプ(Round-to-evenまたはAway-from-zero)を指定できます。Convert.ToInt32()メソッドとそのバリエーションは、round-to-evenを使用します。天井()と床()メソッドが関連しています。
カスタム数値フォーマットで丸めることもできます。
Decimal.Round()はMath.Round()とは異なるメソッドを使用することに注意してください。
銀行員の丸めアルゴリズムの便利な例を以下に示します。丸めに関するレイモンドのユーモラスな投稿の1つをここで参照してください...
//小数点以下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"
数値を丸めたい場合は、次の条件に応じて異なる結果を得ることができます。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);
}
}
変数 'corrector'は、浮動小数点数または倍精度数での操作の不正確さを修正するためのものです。
確認したいのは、Math.Roundの丸めメカニズムです。
http://msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
それ以外は、* 100/100よりもMath.Round(inputNumer、numberOfPlaces)のアプローチをお勧めします。
Math.Floor(123456.646 * 100)/ 100 は123456.64を返します
文字列a = "10.65678";
10進d = Math.Round(Convert.ToDouble(a.ToString())、2)
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