に変換しようとすると問題が発生decimal?
しstring
ます。シナリオは
decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();
現在の結果: 値 = 12.1100
期待される結果: 値 = 12.11
この理由として何が考えられるか教えてください。
Decimal
数値の末尾のゼロを保持しますDecimal
。代わりに小数点以下 2 桁が必要な場合:
decimal? decimalValue = .1211m;
string value = ((decimal)(decimalValue * 100)).ToString("#.##")
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
また
string value = ((decimal)(decimalValue * 100)).ToString("N2")
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
10 進数は、符号、値の各桁の範囲が 0 ~ 9 の数値、および整数部分と小数部分を区切る浮動小数点の位置を示すスケーリング係数で構成される浮動小数点値です。数値の。
Decimal 値のバイナリ表現は、1 ビットの符号、96 ビットの整数、および 96 ビットの整数を除算し、小数部分を指定するために使用されるスケーリング係数で構成されます。倍率は、暗黙的に 10 を 0 から 28 の範囲の指数で累乗したものです。したがって、10 進値のバイナリ表現は、((-2 96から 2 96 ) / 10 (0 から 28) )の形式になります。ここで、-2 96 -1 は MinValue に等しく、2 96 -1 は MaxValue に等しくなります。
スケーリング係数は、10 進数の末尾のゼロも保持します。末尾のゼロは、算術演算または比較演算の 10 進数の値には影響しません。ただし、適切なフォーマット文字列が適用されている場合、>>ToString メソッドによって末尾のゼロが明らかになる可能性があります<<。
備考:
Nullable<decimal>.ToString
形式プロバイダーがないため、10 進数の乗算は 10 進数にキャストする必要があります。Chris が指摘したように、 is の場合を処理する必要がありNullable<decimal>
ますnull
。1 つの方法は、次を使用することNull-Coalescing-Operator
です。
((decimal)(decimalValue ?? 0 * 100)).ToString("N2")
Jon Skeet のこの記事は読む価値があります。
.NET の 10 進浮動小数点数 (せっかちな場合は、ゼロを保持する方法を探してください)
または、「F2」という形式を指定することもできますstring val = decVal.ToString("F2")
。これは、小数点以下 2 桁を指定するためです。
固定小数点 ("F) 書式指定子を使用します。
string value = (decimalValue * 100).ToString("F");
デフォルトの精度指定子は、 NumberFormatInfo.NumberDecimalDigitsプロパティの値に基づいており、デフォルトでは値が 2 です。したがって、 "F" の後に数字を指定しない場合、デフォルトで 2 桁の 10 進数が指定されます。
F0 - No decimal places
F1 - One decimal place
String.Format("{0:0.00}", decimalValue * 100);
.Format()
の代替として使用できます.ToString("0.00"
)。