質問
C# のこれらの行
decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;
Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);
次の出力を生成します。
2
2.0
2.00000000
2.000000000000000000000000000
したがって、リテラルから 10 進変数を作成すると、精度を制御できることがわかります。
- リテラルを使用せずに 10 進変数の精度を調整できますか?
- aからbを作成するにはどうすればよいですか?cからbを作成するにはどうすればよいですか?
解決
このように末尾のゼロを保持する方法は、ECMA CLI 仕様への準拠をより厳密にするために .NET 1.1 で導入されました。
これに関する情報は MSDN にあります。 ここ.
次のように精度を調整できます。
精度を下げるための Math.Round (または Ceiling、Floor など) (b から c)
1.000を掛けると...(必要な小数点以下の桁数を使用して) 精度を上げます - 例:aからbを得るには1.0Mを掛けます。
他のヒント
まったく同じデータの異なる表現が表示されているだけです。の精度 decimal
(合理的な範囲内で) 必要なだけ大きくなるようにスケーリングされます。
から System.Decimal
:
10進数は、符号、値の各数字が0〜9の範囲で構成される浮動小数点値であり、 数値の積分部分と分数部分を分離する浮遊小数点の位置を示すスケーリング係数。
小数値のバイナリ表現は、1ビットの符号、96ビット整数数、および96ビット整数を分割し、その部分が小数の部分を指定するために使用されるスケーリング係数で構成されています。スケーリング係数は暗黙的に10からの数字であり、0〜28の範囲の指数に引き上げられます。したがって、小数値のバイナリ表現は形式です(-296 2へ96) / 10(0〜28))、ここで -296-1はminValueに等しく、296-1はmaxvalueに等しくなります。
スケーリング係数は、小数点以下のゼロを保存します。後続のゼロは、算術操作または比較操作における小数点以下の値に影響しません。ただし、適切なフォーマット文字列が適用されている場合は、トレリング方法では、トレーリングゼロを明らかにすることができます。
何について 恐らくMath.round(小数点以下D、小数点以下をint型)に?
私は空想の1を乗じまたは分割することにより、スケールと「改ざん」ことがわかっています。
decimal a = 2m;
decimal c = 2.00000000m;
decimal PreciseOne = 1.000000000000000000000000000000m;
//add maximum trailing zeros to a
decimal x = a * PreciseOne;
//remove all trailing zeros from c
decimal y = c / PreciseOne;
I 1十分に正確に知られている大きさによってスケールファクタを変更するために製造することができる。
decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;
for (int i = 0; i < scaleFactorSize; i++)
{
scaleFactor *= scaleFactorBase;
}
decimal z = a * scaleFactor;
これは、.NETでdecimal
とSQL Serverでdecimal
を混同することは魅力的です。彼らは全く異なっています。
SQL Serverのdecimal
は、その精度およびスケール列または変数が定義されているときに固定された固定小数点数である。
の.NET decimal
はfloat
とdouble
ような浮動小数点数(decimal
とfloat
が正確バイナリ桁を保存に対しそのdouble
さの差が正確桁を保存)です。すべての計算は、パディングゼロの有無に関わらず、同じ結果をもたらすための.NET decimal
の精度を制御しようとすると、無意味である。
質問です - あなたが本当にというだけで必要とされる精度に小数点以下を表示するよりも、十進数での保存の精度が必要です。 ほとんどのアプリケーションは、彼らが可能と精度のそのレベルに表示する方法を正確に内部的に知っています。たとえば、ユーザーがアカウントパッケージに100の請求書を入力した場合でも、それはまだval.ToString(「N2」)のようなものを使用して100.00として出力します。
どのようにしてから、Bを作成することができますか?どのように私はCからBを作成することができますか?
BとCが可能である。
Console.WriteLine(Math.Round(2.00000000m, 1))
2.0
を生成します 精度を導入する概念は、数学に少し外国人であるように、BとAはトリッキーです。
私は恐ろしいハックは往復可能性が推測します。
decimal b = Decimal.Parse(a.ToString("#.0"));
Console.WriteLine(b);
2.0
を生成しますこれは、小数点からすべての末尾のゼロを削除し、その後、あなただけToString()
を使用することができます。
public static class DecimalExtensions
{
public static Decimal Normalize(this Decimal value)
{
return value / 1.000000000000000000000000000000000m;
}
}
または代わりに、あなたは後続ゼロの正確な数をしたい場合は、5言う、最初のノーマライズ()してから1.00000メートルを掛けます。