10進値を小数点以下2桁に丸める方法(ページへの出力用)
質問
現在 .ToString()
で小数の値を表示する場合、小数点以下15桁が正確であり、ドルとセントを表すために使用しているため、出力のみが必要です小数点以下2桁です。
これには .ToString()
のバリエーションを使用しますか?
解決
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0
または
decimalVar.ToString ("0.##"); // returns "0" when decimalVar == 0
他のヒント
これは古い質問であることは知っていますが、誰もその答えを投稿していないように見えて驚いた;
- 銀行家の丸めを使用しませんでした
- 値を小数として保持しませんでした。
これは私が使用するものです:
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
decimalVar.ToString("F");
これは:
- 小数点以下2桁に丸めます。 23.456 => 23.46
- そこにあることを確認する 常に小数点以下2桁です。 23 => 23.00、12.5 => 12.50
通貨に最適で、金額を表示します。
ToString(" F")のドキュメント: http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (ジョンシュナイダーのおかげで)
表示にこれだけが必要な場合は、string.Formatを使用してください
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double /
" m" 10進数の接尾辞です。 10進数のサフィックスについて:
decimal d = 12.345; 式 d.ToString(" C")または String.Format(" {0:C}&quot ;、d)は $ 12.35 を生成します-シンボルを含む現在のカルチャの通貨設定が使用されることに注意してください。
" C" は、現在のカルチャの桁数を使用します。 C. {Precision specifier}
で String.Format(" {0:C2}&quot ;, 5.123d)
のように、常にデフォルトをオーバーライドして必要な精度を強制することができます。
3,456,789.12 ...などのように、コンマと小数点(ただし通貨記号はなし)でフォーマットしたい場合
decimalVar.ToString("n2");
Decimal.Round(...)を参照する2つの高得点の回答が既にありますが、もう少し説明が必要だと思います-明らかではないDecimalの予期しない重要なプロパティがあるためです。
小数は、それがどこから来たかに基づいて、小数点以下の桁数を「認識」します。
たとえば、次は予期しないことがあります:
Decimal.Parse("25").ToString() => "25"
Decimal.Parse("25.").ToString() => "25"
Decimal.Parse("25.0").ToString() => "25.0"
Decimal.Parse("25.0000").ToString() => "25.0000"
25m.ToString() => "25"
25.000m.ToString() => "25.000"
Double
で同じ操作を行うと、上記のそれぞれに小数点以下の桁数(" 25"
)は与えられません。
小数位を小数点以下2桁にしたい場合、95%の可能性があります。これは通貨であるためです。この場合、これはおそらく95%の時間で問題ありません。
Decimal.Parse("25.0").ToString("c") => "$25.00"
またはXAMLでは、 {Binding Price、StringFormat = c}
AmazonのWebサービスにXMLを送信するときに、小数として小数が必要な場合に遭遇しました。 Decimal値(元はSQL Serverから)が 25.1200
として送信されて拒否されたため( 25.12
は予期された形式でした)、サービスは不平を言っていました。
問題を修正するには、小数点以下2桁の Decimal.Round(...)
のみでした。
// This is an XML message - with generated code by XSD.exe
StandardPrice = new OverrideCurrencyAmount()
{
TypedValue = Decimal.Round(product.StandardPrice, 2),
currency = "USD"
}
TypedValue
は Decimal
型であるため、 ToString(" N2")
を実行できず、丸めて保持する必要がありました decimal
として。
さまざまな形式を表示する小さなLinqpadプログラムを次に示します。
void Main()
{
FormatDecimal(2345.94742M);
FormatDecimal(43M);
FormatDecimal(0M);
FormatDecimal(0.007M);
}
public void FormatDecimal(decimal val)
{
Console.WriteLine("ToString: {0}", val);
Console.WriteLine("c: {0:c}", val);
Console.WriteLine("0.00: {0:0.00}", val);
Console.WriteLine("0.##: {0:0.##}", val);
Console.WriteLine("===================");
}
結果は次のとおりです。
ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: <*>.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: <*>.01
0.00: 0.01
0.##: 0.01
===================
これらのどれも私が必要とするものを正確に実行しなかったため、 2 d.p。を強制して 0.005-&gt; 0.01
強制2 d.p.精度を2 d.p上げる必要があります。少なくとも2 d.p.
2 d.pを超えないようにするための丸め
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
値が0の場合、空の文字列が必要になることはほとんどありません。
decimal test = 5.00;
test.ToString("0.00"); //"5.00"
decimal? test2 = 5.05;
test2.ToString("0.00"); //"5.05"
decimal? test3 = 0;
test3.ToString("0.00"); //"0.00"
最高評価の回答は間違っており、(ほとんどの)人の時間の10分を無駄にしています。
最高評価の回答では、10進数値の文字列表現をフォーマットする方法が説明されており、それが機能します。
ただし、保存されている精度を実際の値に実際に変更する場合は、次のように記述する必要があります。
public static class PrecisionHelper
{
public static decimal TwoDecimalPlaces(this decimal value)
{
// These first lines eliminate all digits past two places.
var timesHundred = (int) (value * 100);
var removeZeroes = timesHundred / 100m;
// In this implementation, I don't want to alter the underlying
// value. As such, if it needs greater precision to stay unaltered,
// I return it.
if (removeZeroes != value)
return value;
// Addition and subtraction can reliably change precision.
// For two decimal values A and B, (A + B) will have at least as
// many digits past the decimal point as A or B.
return removeZeroes + 0.01m - 0.01m;
}
}
単体テストの例:
[Test]
public void PrecisionExampleUnitTest()
{
decimal a = 500m;
decimal b = 99.99m;
decimal c = 123.4m;
decimal d = 10101.1000000m;
decimal e = 908.7650m
Assert.That(a.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("500.00"));
Assert.That(b.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("99.99"));
Assert.That(c.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("123.40"));
Assert.That(d.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("10101.10"));
// In this particular implementation, values that can't be expressed in
// two decimal places are unaltered, so this remains as-is.
Assert.That(e.TwoDecimalPlaces().ToString(CultureInfo.InvariantCulture),
Is.EqualTo("908.7650"));
}
system.globalizationを使用して、必要な形式で数値をフォーマットできます。
例:
system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");
decimal d = 1.2300000
があり、小数点以下2桁に切り捨てる必要がある場合、次のように印刷できます d.Tostring(&quot; F2&quot;、ci);
ここで、F2は小数点以下2桁までの文字列フォーマットであり、ciはロケールまたはcultureinfoです。
詳細については、このリンクを確認してください
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Mike M.の回答は.NETで私にとって完璧でしたが、.NET Coreには decimal.Round
メソッドの作成時。
.NET Coreでは、次を使用する必要がありました:
decimal roundedValue = Math.Round(rawNumber, 2, MidpointRounding.AwayFromZero);
文字列への変換を含むハッキング方法は次のとおりです。
public string FormatTo2Dp(decimal myNumber)
{
// Use schoolboy rounding, not bankers.
myNumber = Math.Round(myNumber, 2, MidpointRounding.AwayFromZero);
return string.Format("{0:0.00}", myNumber);
}
https://msdn.microsoft。 com / en-us / library / dwhawy9k%28v = vs.110%29.aspx
このリンクでは、問題の処理方法と、詳細を知りたい場合の対処方法について詳しく説明しています。簡単にするために、やりたいことは
ですdouble whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
通貨にこれが必要な場合は、「C2」と入力すると簡単になります。 &quot; F2&quot;の代わりに