web-dev-qa-db-ja.com

10進数値を小数点以下2桁に四捨五入する方法(ページへの出力用)

現在.ToString()で小数点の値を表示するとき、それは小数点以下15桁を好むのは正確です、そして私はドルとセントを表すためにそれを使っているので、出力は小数点以下2桁にしたいだけです。

これには.ToString()のバリエーションを使いますか?

579
wows
decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

または

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0
817
albertein

私はこれが古い質問であることを知っています、しかし私は誰もそのような答えを投稿するように見えなかったことを見て驚きました。

  1. 丸め銀行を使用しませんでした
  2. 値を10進数として保持しませんでした。

これは私が使用するものです:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

http://msdn.Microsoft.com/ja-jp/library/9s0xa85y.aspx

543
Mike M.
decimalVar.ToString("F");

この意志:

  • 小数点以下第2位を四捨五入します。 23.456 => 23.46
  • 常に小数点以下2桁があることを確認してください。 23 => 23.00、12.5 => 12.50

通貨や金額の表示に最適です。

ToString( "F")のドキュメント: http://msdn.Microsoft.com/ja-jp/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (Jon Schneiderに感謝します)

308
Sofox

表示にこれだけが必要な場合は、string.Formatを使用してください。

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp-examples.net/string-format-double/ /

"m"は10進数の接尾辞です。 10進数のサフィックスについて

http://msdn.Microsoft.com/ja-jp/library/364x0z75.aspx

100
Jorge Ferreira

与えられた 10進数d = 12.345。 d.ToString( "C") または String.Format( "{0:C}"、d) yield $ 12.35 - noteシンボルを含む現在のカルチャの通貨設定が使用されていること。

"C" は現在のカルチャの桁数を使用することに注意してください。 String.Format("{0:C2}", 5.123d)のようにC{Precision specifier}で必要な精度を強制するためにいつでもdefaultをオーバーライドすることができます。

54
Hafthor

3,456,789.12のように、コンマと小数点(通貨記号は含まない)でフォーマットしたい場合は、.

decimalVar.ToString("n2");
44
Joel Mueller

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%の確率があります。

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

あるいはXAMLでは{Binding Price, StringFormat=c}を使うだけです

AmazonのWebサービスにXMLを送信するときなど、10進数として10進数が必要な場所に出くわしたケースが1つありました。 (元々SQL Serverからの)Decimal値が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"
 }

TypedValueDecimal型なので、ToString("N2")を実行することはできず、それを丸めてdecimalとして保持する必要がありました。

28
Simon_Weaver

これは、さまざまなフォーマットを表示するための小さな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: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================
21
15
John Smith

値が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分を無駄にしました。

9
goamn

これらのどれも、 2 d.pを強制するために、私が必要としていたとおりのことをしませんでした。 および0.005 -> 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"
9
Kaido

一流の答えは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"));
}
8
Alex

System.globalizationを使用して、数値を必要な形式にフォーマットできます。

例えば、次のとおりです。

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");

decimal d = 1.2300000があり、それを小数点以下2桁にトリミングする必要がある場合は、次のように出力できます。d.Tostring("F2",ci);ここで、F2は小数点以下2桁の形式の文字列、ciはロケールまたはcultureinfoです。

このリンクをチェックしてください
http://msdn.Microsoft.com/ja-jp/library/dwhawy9k.aspx

7
Smitha Poluri

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);
}
6
HockeyJ

https://msdn.Microsoft.com/ja-jp/library/dwhawy9k%28v=vs.110%29.aspx

このリンクはあなたがあなたの問題にどう対処することができるかそしてあなたがもっと学びたいならあなたが何ができるかについて詳しく説明します。簡単にするために、あなたがやりたいことは

double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");

通貨でこれを使用する場合は、「F2」ではなく「C2」と入力すると簡単になります。

4
Jeff Jose
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
0
JIYAUL MUSTAPHA