소수점 이하 두 자리까지 소수점 이하 값을 표시하려면 어떻게 해야 합니까?
10 수값으로 소수점 하는 경우.ToString()
소수점 15자리를 좋아하는 것이 정확합니다. 그리고 제가 달러와 센트를 나타내는 데 사용하기 때문에, 저는 소수점 2자리만 출력하기를 원합니다.
의 변형을 사용합니까?.ToString()
이것 때문에?
decimalVar.ToString("#.##"); // returns ".5" when decimalVar == 0.5m
또는
decimalVar.ToString("0.##"); // returns "0.5" when decimalVar == 0.5m
또는
decimalVar.ToString("0.00"); // returns "0.50" when decimalVar == 0.5m
이것이 오래된 질문이라는 것을 알지만, 아무도 다음과 같은 답변을 게시하지 않는 것을 보고 놀랐습니다.
- 은행원 반올림을 사용하지 않았습니다.
- 값을 10진수로 유지합니다.
이것이 제가 사용하는 것입니다.
decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);
http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx
decimalVar.ToString("F");
다음 작업을 수행합니다.
- 소수점 이하 두 자리로 반올림합니다.
23.456
→23.46
- 소수점 이하의 자리가 항상 2개인지 확인합니다.
23
→23.00
;12.5
→12.50
통화 표시에 적합합니다.
ToString("F")에 대한 설명서를 확인하십시오(Jon Schneider 덕분).
표시를 위해 필요한 경우 문자열을 사용합니다.포맷
String.Format("{0:0.00}", 123.4567m); // "123.46"
http://www.csharp-examples.net/string-format-double/
"m"은 십진수 접미사입니다.소수 접미사 정보:
http://msdn.microsoft.com/en-us/library/364x0z75.aspx
3,456,789.12와 같이 소수점(통화 기호 없음)뿐만 아니라 쉼표로 형식을 지정하려면...
decimalVar.ToString("n2");
10진수 d=12.345, 식 d가 주어집니다.ToString("C") 또는 String.형식("{0:C}", d) $12.35 - 기호를 포함한 현재 문화의 통화 설정이 사용됩니다.
"C"는 현재 문화의 자릿수를 사용합니다.항상 기본값을 재정의하여 필요한 정밀도를 강제로 적용할 수 있습니다.C{Precision specifier}
맘에 들다String.Format("{0:C2}", 5.123d)
.
매우 중요한 특징이 있습니다.Decimal
그것은 명백하지 않습니다:
A
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"
위의 모든 예에 대해 ).
소수점 이하 두 자리까지 원하는 경우 통화이기 때문에 가능성이 높습니다. 이 경우 95% 동안은 문제가 없을 수 있습니다.
Decimal.Parse("25.0").ToString("c") => "$25.00"
에서는 XAML 용할수있습다를 합니다.{Binding Price, StringFormat=c}
아마존 웹 서비스에 XML을 보낼 때 소수점으로 십진수가 필요했던 경우가 있었습니다. 값에서 원래 값("SQL Server")으로 .25.1200
그리고 거절당했습니다, (25.12
예상된 형식)입니다.
내가 해야 할 일은Decimal.Round(...)
값의 출처에 관계없이 문제를 해결할 소수점 두 자리로 표시합니다.
// 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
===================
값이 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분을 낭비했습니다.
.NET에서 Mike M.의 답변은 완벽했지만 .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);
}
이들 중 어느 것도 제가 필요로 하는 것을 정확히 하지 못했습니다. 2D.P.를 강요하고, 다음과 같이 말이죠.0.005 -> 0.01
2dp를 강제로 적용하려면 최소 2dp를 확보하기 위해 정밀도를 2dp만큼 높여야 합니다.
그리고 나서 2 dp 이상이 되지 않도록 반올림합니다.
Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)
6.665m.ToString() -> "6.67"
6.6m.ToString() -> "6.60"
최상위 등급의 답변은 십진수 값의 문자열 표현 형식을 지정하는 방법을 설명하며, 이 방법이 작동합니다.
그러나 실제로 저장된 정밀도를 실제 값으로 변경하려면 다음과 같은 내용을 작성해야 합니다.
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
그리고 소수점 두 자리로 잘라야 이렇게 인쇄할 수 있습니다.d.Tostring("F2",ci);
여기서 F2는 소수점 이하 두 자리로 구성되는 문자열이고 ci는 로케일 또는 문화 정보입니다.
자세한 내용은 이 링크를 확인하십시오.
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
https://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx
이 링크는 문제를 해결하는 방법과 더 많은 정보를 얻고자 하는 경우 수행할 수 있는 작업에 대해 자세히 설명합니다.단순성을 위해 다음과 같은 작업을 수행할 수 있습니다.
double whateverYouWantToChange = whateverYouWantToChange.ToString("F2");
통화에 대해 이것을 원한다면, "F2" 대신 "C2"를 입력하면 더 쉽게 만들 수 있습니다.
가장 적용 가능한 해결책은 다음과 같습니다.
decimalVar.ToString("#.##");
Double Amount = 0;
string amount;
amount=string.Format("{0:F2}", Decimal.Parse(Amount.ToString()));
소수점 자리 2개만 유지해야 하는 경우(즉, 나머지 소수점 자리 모두 잘라내기):
decimal val = 3.14789m;
decimal result = Math.Floor(val * 100) / 100; // result = 3.14
소수점 이하 세 자리만 유지해야 하는 경우:
decimal val = 3.14789m;
decimal result = Math.Floor(val * 1000) / 1000; // result = 3.147
var arr = new List<int>() { -4, 3, -9, 0, 4, 1 };
decimal result1 = arr.Where(p => p > 0).Count();
var responseResult1 = result1 / arr.Count();
decimal result2 = arr.Where(p => p < 0).Count();
var responseResult2 = result2 / arr.Count();
decimal result3 = arr.Where(p => p == 0).Count();
var responseResult3 = result3 / arr.Count();
Console.WriteLine(String.Format("{0:#,0.000}", responseResult1));
Console.WriteLine(String.Format("{0:#,0.0000}", responseResult2));
Console.WriteLine(String.Format("{0:#,0.00000}", responseResult3));
당신은 원하는 만큼 0을 넣을 수 있습니다.
언급URL : https://stackoverflow.com/questions/164926/how-do-i-display-a-decimal-value-to-2-decimal-places
'programing' 카테고리의 다른 글
C#에서 프로세스를 시작하려면 어떻게 해야 합니까? (0) | 2023.06.02 |
---|---|
Ruby %r{} 식 (0) | 2023.06.02 |
AzureBob 업로드 오류: 지정한 BLOB가 이미 있습니다. (0) | 2023.05.28 |
해결 방법: "현재 중단점이 적용되지 않습니다.이 문서에 대한 기호가 로드되지 않았습니다." 경고? (0) | 2023.05.28 |
C#에서 열거를 목록으로 변환하려면 어떻게 해야 합니까? (0) | 2023.05.28 |