10進数値を小数点以下2桁に丸める方法(ページの出力用)


649

現在で小数の値を表示する場合、小数点以下.ToString()15桁で正確です。ドルとセントを表すために使用しているので、出力を小数点以下2桁にしたいだけです。

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

回答:


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

または

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

31
ここでの問題は、0.00がある場合です。空の文字列を返します。
Jronny、

164
次に、decimalVar.ToString( "0。##")を実行できます。フォーマット文字列として0.00を使用することもできます。
albertein

54
このソリューションでは、数値を読み取るときに予想されるカルチャの書式設定はありません。これには、ToString( "N2")またはToString( "N")を使用する必要があります。
Shautieh 2014

2
@Hill DecimalおよびDoubletype ToStringメソッドは、フォーマットの引数を受け入れます。最初に値をDecimal / Doubleに変換してみてください。
sohaiby 2016年

1
@ f470071 10進数は値の型であるため、決して「変更」されることはありません。とにかく、ToString()が呼び出された内容を変更することは決して期待されていません。
ジャスティンスカイズ

590

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

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

これは私が使うものです:

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

http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx


3
ToStringまたはstring.Formatは銀行の丸めを使用しません:msdn.microsoft.com/en-us/library/0c899ak8.aspx#sectionToggle1
Matthijs Wessels

1
@MatthijsWessels知っています...しかし、値を10進数として保持しません。
Mike M.

1
末尾のゼロは削除されないため、これは小数点以下2桁を正確に表すためのより良い方法です。
LiquidDrummer

355
decimalVar.ToString("F");

この意志:

  • 小数点以下2桁に四捨五入します。 23.45623.46
  • 常に小数点以下2桁になるようにしてください 2323.00; 12.512.50

通貨の表示に最適です。

ToString( "F")のドキュメントをチェックしてください(Jon Schneiderに感謝)。


10
これは、小数点が1つしかない場合に正常に機能します。.ToString( "#。##")は失敗します。この答えははるかに優れています
エリックフリック

2
23.456 => 23.46に丸めませんか?
rtpHarry 2013年

14
ここではどのような「F」との文書、そしてどのように動作します:msdn.microsoft.com/en-us/library/...
ジョン・シュナイダー

4
"F"ではなく.ToString( "N")にしないのはなぜですか?どちらもこの質問のニーズに対応できると私は理解していますが、Nは数千の数値にもコンマを入れます。
jgerman 2014

注:カルチャに基づいて.が置き換えられる場合があります,CultureInfo.InvariantCultureこれを無効にするには、2番目の引数として渡す必要があります。
Duncan Luk

106

表示にこれが必要な場合は、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/en-us/library/364x0z75.aspx


10
技術的には、10進数の場合、123.4567mになりますね。「m」接尾辞がなければ、2倍になります
Adam Tegen

2
またはショートカット$ "{value:0.00}"
mamczas 2018年

56

10進数のd = 12.345が与えられます。d.ToString( "C")またはString.Format( "{0:C}"、d)$ 12.35になります -記号を含む現在のカルチャの通貨設定が使用されることに注意してください。

「C」は現在のカルチャからの桁数を使用することに注意してください。C{Precision specifier}likeを使用すると、常にデフォルトをオーバーライドして必要な精度を強制できますString.Format("{0:C2}", 5.123d)


4
@ Slick86-現在のサイン
fubo 2015年

48

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

decimalVar.ToString("n2");

1
質問はページに出力することに関するものであり、数字のフォーマットは大きな数字にとって重要であるため、より良い答えです。それは「3.456.789,12」かもしれないのでまた、「N *」など、「3 456 789,12」、アカウントに現在の文化を取る
Shautieh

29

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}

10進数として10進数が必要な場合に遭遇したのは、XMLをAmazonのWebサービスに送信するときでした。(元はSQL Serverからの)Decimal値が送信され25.1200拒否されたため、サービスは不満を示していました(25.12予期された形式でした)。

Decimal.Round(...)この問題を解決するために必要なのは、小数点以下2桁のみでした。

 // 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


5
+1これは素晴らしい答えです。System.Decimalが「小数点以下の桁数を知っている」と言った場合、用語は、System.Decimalが他の浮動小数点型のように自己正規化しないことです。System.Decimalのもう1つの便利なプロパティは、数学演算の結果が常に入力引数の小数点以下の桁数が最も多いことです。1.0m + 2.000m = 3.000m。この事実を使用して、1.00mを掛けるだけで、小数点以下の桁のない小数点を2桁に強制できます。10m * 1.00m = 10.00m
MattDavey 2012年

2
MattDaveyは正しくありません。小数の精度が追加されます。(1.0m * 1.00m).ToString()= "1.000"
Kaido

2
「10進数は、それがどこから来たかに基づいて、小数点以下の桁数を「知っている」ことを知っていると非常に役立ちます。どうもありがとう!
iheartcsharp 2013

21

以下は、さまざまな形式を表示する小さな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
===================


11

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


1
基本的 "#"に数値の数字を意味します(必要な場合)(不要な場合はパディングなし)"0"は数字の数字を意味します(何も
重要で

10

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

9

これらのどれも、2 dpを強制し、0.005 -> 0.01

2 dpを強制するには、少なくとも2 dpを確保するために精度を2 dp増やす必要があります。

次に、2 dpを超えないように丸めます

Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"

9

最高評価の回答は、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"));
}

7

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

例えば:

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

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

詳細については、このリンクを確認してください
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx


+1ただし、CultureInfoオブジェクトは、小数点以下の桁を示すために使用されるUnicode文字にのみ影響します。例えば。fr-FRは、ピリオドの代わりにコンマを使用します。レンダリングされる小数点以下の桁数とは関係ありません。
MattDavey 2012年

4

https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx

このリンクでは、問題の処理方法と、詳細を知りたい場合の対処方法について詳しく説明しています。簡単にするために、あなたがしたいことは

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

通貨にこれが必要な場合は、「F2」の代わりに「C2」と入力することで簡単にできます。



1

小数点以下2桁のみを保持する必要がある場合(つまり、残りの10進数をすべて切り捨てます):

decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14

小数点以下3桁のみを保持する必要がある場合:

decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.