2014-04-04 2 views
2

실제로 미친 것처럼 보이는 질문을하지만 WCF에서는 간단한 계약이 있고 때로는 10 진수의 DataContract가있을 때 서비스가 "."뒤에 4 자리를 돌려 보냅니다. 나는 실제로 2 자릿수 밖에 갖기를 기대하지 않습니다. 가능한가? 예를함으로써WCF 및 DataContract : "."다음에 4 자리 숫자를 나타내는 Decimal 때로는 2 자리 만

: 이런 일이 왜

<a:ClassB> 
    <a:VarA>47.34</a:VarA> 
    <a:VarB>23.1200</a:VarB> 
</a:ClassB> 

그리고 아는 사람 않습니다 서비스에 대한 호출 후

namespace MyContract.Data 
{ 
    [DataContract] 
    public class ClassB : ClassA 
    { 
     [DataMember] 
     public decimal VarA { get; set; } 

     [DataMember] 
     public decimal VarB { get; set; } 
    } 
} 

내가받을 출력은 같은 것입니다?

답변

2

DataContractSerializer은 자신이 표현하고자하는대로 decimal을 단순히 직렬화하기 때문에 발생합니다. Console.Write 또는 일부 형식을 지정하지 않고 다른 작업을 수행하면 동일한 출력을 얻게됩니다.

그 이유는 (가능할 수도 있음) 인 23.12와 23.1200 사이의 차이, 즉 정밀도 때문입니다. 값이 당신이 실험실에서하고있는 어떤 측정 값을 나타낸다 고 상상해 봅시다. 끝에있는 여분의 0은 23.1204 또는 23.1211이 아니라는 것을 알기에 충분히 정확하게 값을 측정했다는 것을 의미합니다. 그러나 23.12는 다른 한편으로는 낮은 정밀도를 가지며 동일한 측정의 결과 일 수 있지만 부정확 한 계측기로 인해 발생할 수 있습니다.

이제 특정 용도와 관련이 없을 수 있습니다. 정확히 x 숫자를 반환 할 필요가있는 경우에, 당신은 직렬화하기 전에 소수를 반올림 할 수 있습니다

ClassB b = // some initialization 
b.VarA = Decimal.Round(b.VarA, x); 
b.VarB = Decimal.Round(b.VarB, x); 

이 일부 데이터를 멀리 던져, 정밀도가 실제로 의미있는 경우 (위에서 언급 한 바와 같이)하지만, 너무 조심하세요.

단지 프레젠테이션 목적 일 경우, 대신 디스플레이에서 형식을 지정하는 것을 고려하십시오.

+0

시도해 보겠습니다. 감사 – Nordes

관련 문제