소수점 값을 소수점 이하 2 자리로 어떻게 반올림합니까 (페이지의 출력)

StackOverflow https://stackoverflow.com/questions/164926

  •  03-07-2019
  •  | 
  •  

문제

현재 소수점의 값을 표시 할 때 .ToString(), 그것은 소수점 이하 자리를 좋아하는 것이 정확하며, 달러와 센트를 나타내는 데 사용하기 때문에 출력이 소수점 이하 자리가되기를 원합니다.

변형을 사용합니까? .ToString() 이것을 위해?

도움이 되었습니까?

해결책

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

또는

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

다른 팁

나는 이것이 오래된 질문이라는 것을 알고 있지만, 아무도 그 대답을 게시하지 않는 것을보고 놀랐습니다.

  1. 은행가 반올림을 사용하지 않았습니다
  2. 값을 소수점으로 유지하지 않았습니다.

이것이 제가 사용할 것입니다.

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

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

decimalVar.ToString("F");

이것은 :

  • 소수점 이하 2 자리로 반올림합니다. 23.456 => 23.46
  • 소수점 이하의 장소가 항상 있는지 확인하십시오. 23 => 23.00, 12.5 => 12.50

통화 및 금전적 금액 표시에 이상적입니다.

Tostring ( "F")에 대한 문서 : http://msdn.microsoft.com/en-us/library/dwawy9k%28v=vs.110%29.aspx#fformatstring (Jon Schneider에게 감사합니다)

디스플레이에 필요한 경우 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

주어진 십진 D = 12.345; 표현 D. TOSTRING ( "C") 또는 string.format ( "{0 : c}", d) 생산하다 $12.35 - 기호를 포함한 현재 문화의 통화 설정이 사용됩니다.

주목하십시오 "씨" 현재 문화의 숫자 수를 사용합니다. 필요한 정밀도를 강제하기 위해 항상 기본값을 재정의 할 수 있습니다. C{Precision specifier} 처럼 String.Format("{0:C2}", 5.123d).

3,456,789.12와 같은 소수점과 소수점 (통화 기호 없음)과 함께 쉼표와 포맷을 원한다면 ...

decimalVar.ToString("n2");

Decimal.round (...)를 언급하는 두 가지 높은 점수 답변이 있지만 조금 더 설명이 필요하다고 생각합니다. 왜냐하면 명백하지 않은 소수점의 예상치 못한 중요한 속성이 있기 때문입니다.

소수점은 어디에서 왔는지에 따라 소수점 이하의 자리를 '알고 있습니다.

예를 들어 다음은 예상치 못한 일 수 있습니다.

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}

XML을 Amazon의 웹 서비스로 보낼 때 소수판이 소수판이 필요한 곳으로 들어갔다. 소수점 값 (원래 SQL Server)이 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.

다음은 다른 형식을 보여주는 작은 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
===================

이들 중 어느 것도 내가 필요한 것을 정확히하지 않았다. 2 DP 그리고 라운드 업 0.005 -> 0.01

2dp를 강제하려면 정밀도를 2dp로 증가시켜야합니다.

그런 다음 반올림하여 DP가 2 개를 넘지 않도록

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 분 동안 낭비했습니다.

최상위 답변은 서식을위한 방법을 설명합니다 문자열 표현 소수점 값의 경우 작동합니다.

그러나 실제로 저장된 정밀도를 실제 값으로 변경하려면 다음과 같은 것을 작성해야합니다.

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("F2",ci); 여기서 F2는 문자열이 2 진수 자리로 형성되고 Ci는 로케일 또는 CultureInfo입니다.

자세한 내용은이 링크를 확인하십시오
http://msdn.microsoft.com/en-us/library/dwawy9k.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/dwawy9k%28v=vs.110%29.aspx

이 링크는 문제를 처리 할 수있는 방법과 자세한 내용을 원할 경우 수행 할 수있는 작업을 자세히 설명합니다. 단순성 목적을 위해, 당신이하고 싶은 것은

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

통화를 위해 이것을 원한다면 "f2"대신 "C2"를 입력하여 쉽게 만들 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top