문제

C#의 다음 줄

decimal a = 2m;
decimal b = 2.0m;
decimal c = 2.00000000m;
decimal d = 2.000000000000000000000000000m;

Console.WriteLine(a);
Console.WriteLine(b);
Console.WriteLine(c);
Console.WriteLine(d);

다음 출력을 생성합니다.

2
2.0
2.00000000
2.000000000000000000000000000

따라서 리터럴에서 10진수 변수를 생성하면 정밀도를 제어할 수 있다는 것을 알 수 있습니다.

  • 리터럴을 사용하지 않고 소수 변수의 정밀도를 조정할 수 있나요?
  • a에서 b를 어떻게 만들 수 있나요?c에서 b를 어떻게 만들 수 있나요?
도움이 되었습니까?

해결책

ECMA CLI 사양에보다 엄격한 일치를 위해 .NET 1.1에 이와 같은 후행 제로를 보존했습니다.

msdn에 이것에 대한 정보가 있습니다. 여기.

다음과 같이 정밀도를 조정할 수 있습니다.

  • 정밀도를 줄이기위한 수학 (또는 천장, 바닥 등)

  • 1.000을 곱하십시오 ... (원하는 소수의 수와 함께) 정밀도를 높이려면 -1에서 1.0m를 곱하여 b에서 b를 얻습니다.

다른 팁

당신은 정확히 동일한 데이터의 다른 표현을 보고 있을 뿐입니다.a의 정밀도 decimal (합리적인 범위 내에서) 필요한 만큼 크게 확장됩니다.

에서 System.Decimal:

10진수는 부동 소수점입니다 부호로 구성된 값, 숫자 값, 여기서 각 숫자는 값의 범위는 0에서 9까지이며, 숫자 값의 적분 및 분수 부분을 분리하는 부동 소수점의 위치를 ​​나타내는 스케일링 계수.

Decimal의 이진 표현 value는 1비트 부호로 구성되며, 96비트 정수 및 배율 조정 96비트를 나누는 데 사용되는 요소 정수를 입력하고 그 중 어느 부분을 지정할지 지정합니다. 는 소수 자릿수입니다.스케일링 factor는 암묵적으로 숫자 10이고, 0 범위의 지수로 올림 를 28로 설정합니다.따라서 바이너리 Decimal 값의 표현은 다음과 같습니다. 의 양식, ((-296 2로96) / 10(0 ~ 28)), 여기서 -296-1은 다음과 같습니다. MinValue, 296-1은 다음과 같습니다. MaxValue입니다.

배율 인수는 또한 모든 10진수에서 후행 0입니다.후행 0은 영향을 주지 않습니다. 의 10진수 값 산술 또는 비교 연산.그러나 후행 0은 ToString 메서드에 의해 표시되는 경우 적절한 형식 문자열이 적용됩니다.

나는 공상 1으로 곱하거나 나누어 스케일을 "변조"할 수 있음을 발견했습니다.

decimal a = 2m;
decimal c = 2.00000000m;
decimal PreciseOne = 1.000000000000000000000000000000m;
  //add maximum trailing zeros to a
decimal x = a * PreciseOne;
  //remove all trailing zeros from c
decimal y = c / PreciseOne;

알려진 크기로 척도 요소를 변경하기에 충분히 정확한 1을 제작할 수 있습니다.

decimal scaleFactorBase = 1.0m;
decimal scaleFactor = 1m;
int scaleFactorSize = 3;

for (int i = 0; i < scaleFactorSize; i++)
{
  scaleFactor *= scaleFactorBase;
}

decimal z = a * scaleFactor;

혼동하려는 유혹입니다 decimal SQL 서버에서 decimal .NET에서; 그들은 상당히 다릅니다.

SQL 서버 decimal 열이나 변수가 정의 될 때 정밀도와 스케일이 고정 된 고정점 번호입니다.

.NET decimal 부동 소수점 번호입니다 float 그리고 double (그 차이는 그 것입니다 decimal 정확하게 소수점 숫자를 보존하지만 float 그리고 double 이진 숫자를 정확하게 보존하십시오). .NET의 정밀도를 제어하려고합니다 decimal 무의미합니다. 모든 계산은 패딩 제로의 존재 또는 부재에 관계없이 동일한 결과를 산출하기 때문에 무의미합니다.

문제는 - 정말로 정밀도가 필요합니까? 저장 소수점에서는 소수점을 필요한 정밀도에 표시하는 것이 아니라. 대부분의 응용 프로그램은 내부적으로 자신이 얼마나 정확한지를 알고 있으며 그 수준의 정밀도에 표시됩니다. 예를 들어, 사용자가 계정 패키지에서 100에 대한 송장을 입력하더라도 Val.toString ( "N2")과 같은 것을 사용하여 100.00으로 인쇄합니다.

A에서 B를 어떻게 만들 수 있습니까? C에서 b를 어떻게 만들 수 있습니까?

C에서 B에서 B가 가능합니다.

Console.WriteLine(Math.Round(2.00000000m, 1)) 

2.0을 생성합니다

정밀도를 도입하는 개념은 수학에 약간의 외계인이기 때문에 A에서 B에서 B까지는 까다 롭습니다.

끔찍한 해킹이 왕복이 될 수 있다고 생각합니다.

decimal b = Decimal.Parse(a.ToString("#.0"));
Console.WriteLine(b);

2.0을 생성합니다

이것은 소수점에서 모든 후행 0을 제거하고 만 사용할 수 있습니다. ToString().

public static class DecimalExtensions
{
    public static Decimal Normalize(this Decimal value)
    {
        return value / 1.000000000000000000000000000000000m;
    }
}

또는 또는 정확한 수의 후행 0 (5)을 원한다면 먼저 ()를 정규화 한 다음 1.00000m를 곱하십시오.

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