16

に変換しようとすると問題が発生decimal?stringます。シナリオは

decimal decimalValue = .1211;
string value = (decimalValue * 100).ToString();

現在の結果: 値 = 12.1100

期待される結果: 値 = 12.11

この理由として何が考えられるか教えてください。

4

7 に答える 7

20

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

からSystem.Decimal:

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 メソッドによって末尾のゼロが明らかになる可能性があります<<。

備考:

  1. Nullable<decimal>.ToString形式プロバイダーがないため、10 進数の乗算は 10 進数にキャストする必要があります。
  2. Chris が指摘したように、 is の場合を処理する必要がありNullable<decimal>ますnull。1 つの方法は、次を使用することNull-Coalescing-Operatorです。

    ((decimal)(decimalValue ?? 0 * 100)).ToString("N2")
    

Jon Skeet のこの記事は読む価値があります。

.NET の 10 進浮動小数点数 (せっかちな場合は、ゼロを保持する方法を探してください)

于 2013-05-15T10:26:27.920 に答える
2

または、「F2」という形式を指定することもできますstring val = decVal.ToString("F2")。これは、小数点以下 2 桁を指定するためです。

于 2013-05-15T10:25:12.803 に答える
2

固定小数点 ("F) 書式指定子を使用します。

   string value = (decimalValue * 100).ToString("F");

デフォルトの精度指定子は、 NumberFormatInfo.NumberDecimalDigitsプロパティの値に基づいており、デフォルトでは値が 2 です。したがって、 "F" の後に数字を指定しない場合、デフォルトで 2 桁の 10 進数が指定されます。

F0 - No decimal places
F1 - One decimal place
于 2013-05-15T10:26:22.400 に答える
0
String.Format("{0:0.00}", decimalValue * 100);

.Format()の代替として使用できます.ToString("0.00")。

于 2013-05-15T10:25:00.650 に答える